PDA

View Full Version : دستور بک استک را در ویوپیجر چگونه بنویسیم؟



sco1385
شنبه 20 اردیبهشت 1393, 13:44 عصر
با سلام

من یک اپ ویوپیجر دارم با ده صفحه.

الان وقتی دکمه بک را می‌زنم، برنامه خاتمه پیدا می‌کند درحالی که من چند صفحه را نگاه کرده‌ام.

اما برنامه به صفحه قبلی برنمی‌گردد.

من از کدهای زیر در داخل فرگمنت‌ها برای انتقال به فرگمنت دیگر استفاده کرده‌ام:



FragmentManager myFragmentManager1 =getActivity().getSupportFragmentManager();
FragmentTransaction ft1 = myFragmentManager1.beginTransaction();
Fragment myFragment1 = new Sara();
ft1.replace(R.id.pager, myFragment1);
String tag1 = null;
ft1.addToBackStack(tag1);
ft1.commit();


کد اشتباه است؟ یا باید کار دیگری هم انجام دهم؟

rubiks.kde
شنبه 20 اردیبهشت 1393, 19:51 عصر
بهتره توی خود کلاسی که view pager رو ساختید برای دکمه back کد بزنید ، به این صورت.
یه منغییر به نام index داشته باشید که با تغییر view pager موقعیت (index) صفحه مورد نظر رو در خودش نگه داره و زمانی که دکمه back زده میشه اگه index = 0 بود از برنامه بره برین والا یکی از index کم کنه و view pager رو به index منتقل کنه.

از setCurrentItem (http://developer.android.com/reference/android/support/v4/view/ViewPager.html#setCurrentItem(int))(int item) برای رفتن به صفحه مورد نظر و از setOnPageChangeListener (http://developer.android.com/reference/android/support/v4/view/ViewPager.html#setOnPageChangeListener(android.sup port.v4.view.ViewPager.OnPageChangeListener))(View Pager.OnPageChangeListener (http://developer.android.com/reference/android/support/v4/view/ViewPager.OnPageChangeListener.html) listener) هم برای اینکه بتونی index رو مقدار بدی استفاده کن

sco1385
دوشنبه 22 اردیبهشت 1393, 12:33 عصر
کاش دوستان یک کد در این باره بنویسند.

من هنوز مبتدی هستم. و انجام دستورات جناب روبیک برایم فعلاً غیرممکن است.

متشکرم

sco1385
چهارشنبه 07 خرداد 1393, 13:43 عصر
بهتره توی خود کلاسی که view pager رو ساختید برای دکمه back کد بزنید ، به این صورت.
یه منغییر به نام index داشته باشید که با تغییر view pager موقعیت (index) صفحه مورد نظر رو در خودش نگه داره و زمانی که دکمه back زده میشه اگه index = 0 بود از برنامه بره برین والا یکی از index کم کنه و view pager رو به index منتقل کنه.

از setCurrentItem (http://developer.android.com/reference/android/support/v4/view/ViewPager.html#setCurrentItem(int))(int item) برای رفتن به صفحه مورد نظر و از setOnPageChangeListener (http://developer.android.com/reference/android/support/v4/view/ViewPager.html#setOnPageChangeListener(android.sup port.v4.view.ViewPager.OnPageChangeListener))(View Pager.OnPageChangeListener (http://developer.android.com/reference/android/support/v4/view/ViewPager.OnPageChangeListener.html)
listener) هم برای اینکه بتونی index رو مقدار بدی استفاده کن


دوستان گرامی، کسی می‌تونه این کدی رو که روبیک عزیز گفتند برای من بنویسه.

الان، تا دکمه بک رو میزنم، برنامه بسته میشه.

ممنون میشم اگر دوستی این کار رو انجام بده.

#root#
چهارشنبه 07 خرداد 1393, 14:14 عصر
بفرمایید ، فقط بصورت سمبلیک نوشتم که متوجه بشین (توی notepad نوشتم)
public calss Main extend FragmentActivity {

int index = 0;

@overide
onCreate() {

myViewPager.setOnPageChangeListener(new OnPageChangeListener(){

@overide
onPageScrolled (int position, float positionOffset, int positionOffsetPixels){
index = position;
}
});

}

@overide
onBackPressed(){
if(index != 0){
index = index - 1;
myViewPager.setCurrentItem(index);
} else {
super.onBackPressed();
}
}

}

sco1385
چهارشنبه 07 خرداد 1393, 14:28 عصر
آیا این کار من درست است:

این کد را در کلاس اصلی بگذارم:



intindex = 0;


و این کد را در متد آن‌کریت :



myViewPager.setOnPageChangeListener(new OnPageChangeListener(){

@overide
onPageScrolled (int position, float positionOffset, int positionOffsetPixels){
index = position;
}
});


خب، این دستور را در کجا قرار بدهم؟



@overide
onBackPressed(){
if(index != 0){
index = index - 1;
myViewPager.setCurrentItem(index);
} else {
super.onBackPressed();
}
}



راهنمایی لطفاً

ممنون

#root#
چهارشنبه 07 خرداد 1393, 14:34 عصر
تو کدی که نوشتم معلومه ، مثل متد oncreate تو بدنه اصلی کلاس ، انگاری دو تا متد oncreate دارین که زیر هم هستند.

sco1385
چهارشنبه 07 خرداد 1393, 15:01 عصر
روت گرامی

با تشکر از کد.

ایرادات زیادی می‌گیرد.

اول : کلمه @overide را در کد بالا اصلاح کنید تا دیگران به مشکل برنخورند: @Override

دوم : می‌گوید که در متد آن‌کریت نوع ریترن باید مشخص باشد.و دو گزینه پیشنهاد می‌کند: void و کانسراکتر. void را انتخاب کردم. بعد می‌گوید باید اورراید را حذف کنی.

سوم : روی OnPageChangeListener اخطار می‌دهد، و می‌گوید باید : add unimplemented methods

چهارم : روی متد بعدی هم هشدار می‌دهد که ریترن باید ووید باشد.

لطفاً یک بار دیگر به کد نظری بیاندازید.

ممنون

sco1385
چهارشنبه 07 خرداد 1393, 15:04 عصر
قابل توجه آنکه، برنامه من از ساپورت لایبری v4 استفاده می‌کند.

#root#
چهارشنبه 07 خرداد 1393, 19:01 عصر
روت گرامی

با تشکر از کد.

ایرادات زیادی می‌گیرد.

اول : کلمه @overide را در کد بالا اصلاح کنید تا دیگران به مشکل برنخورند: @Override

دوم : می‌گوید که در متد آن‌کریت نوع ریترن باید مشخص باشد.و دو گزینه پیشنهاد می‌کند: void و کانسراکتر. void را انتخاب کردم. بعد می‌گوید باید اورراید را حذف کنی.

سوم : روی OnPageChangeListener اخطار می‌دهد، و می‌گوید باید : add unimplemented methods

چهارم : روی متد بعدی هم هشدار می‌دهد که ریترن باید ووید باشد.

لطفاً یک بار دیگر به کد نظری بیاندازید.

ممنون
همونطور که گفتم صرفا جهت یادگیری نوشتم که نحوه کار رو بدونید ، بفرمایید :
public class Main extends FragmentActivity {

ViewPager myViewPager;
int index;

@Override
protected void onCreate(Bundle arg0) {
super.onCreate(arg0);

myViewPager.setOnPageChangeListener(new OnPageChangeListener() {

@Override
public void onPageSelected(int arg0) {
}

@Override
public void onPageScrolled(int position, float arg1, int arg2) {
index = position;

}

@Override
public void onPageScrollStateChanged(int arg0) {
}
});
}

@Override
public void onBackPressed() {
if (index != 0) {
index = index - 1;
myViewPager.setCurrentItem(index);
return;
}
super.onBackPressed();
}

}

sco1385
چهارشنبه 07 خرداد 1393, 19:27 عصر
با تشکر

الان کد در مجموع چنین است:



public class MainActivity extends FragmentActivity {


ViewPager myViewPager;
int index = 0;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}

@Override
protected void onCreate(Bundle arg0) {
super.onCreate(arg0);

myViewPager.setOnPageChangeListener(new OnPageChangeListener() {

@Override
public void onPageSelected(int arg0) {
}

@Override
public void onPageScrolled(int position, float arg1, int arg2) {
index = position;

}

@Override
public void onPageScrollStateChanged(int arg0) {
}
});
}

@Override
public void onBackPressed() {
if (index != 0) {
index = index - 1;
myViewPager.setCurrentItem(index);
return;
}
super.onBackPressed();
}

}



روی این عبارت خطا می‌گیرد:



onCreate(Bundle arg0)


اخطار : Duplicate method onCreate(Bundle) in type MainActivity

ممنون

#root#
چهارشنبه 07 خرداد 1393, 20:22 عصر
روی این عبارت خطا می‌گیرد:



onCreate(Bundle arg0)


اخطار : Duplicate method onCreate(Bundle) in type MainActivity

ممنون
قبول دارید که اشکال از جانب شماست دیگه؟!

public class MainActivity extends FragmentActivity {


ViewPager myViewPager;
int index = 0;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

myViewPager.setOnPageChangeListener(new OnPageChangeListener() {

@Override
public void onPageSelected(int arg0) {
}

@Override
public void onPageScrolled(int position, float arg1, int arg2) {
index = position;

}

@Override
public void onPageScrollStateChanged(int arg0) {
}
});
}
}

@Override
public void onBackPressed() {
if (index != 0) {
index = index - 1;
myViewPager.setCurrentItem(index);
return;
}
super.onBackPressed();
}

}

sco1385
چهارشنبه 07 خرداد 1393, 20:48 عصر
من مخلص شما هستم. گردن‌مان از مو باریک‌تر.

من تازه‌کارم. و ذر حال آموزش.

گرچه پیرمردم و 56 سال دارم.

کارم فکری است و نه اقتصادی.

کم کم یاد می‌گیرم.

رشته تحصیلی من مهندسی راه ساختمان بوده.

دوره ما (1356) دستگاه پانچ بود!!

برای همین برنامه‌نویسی نخواندم!

ممنون از همکاری.

زنده باشی.

sco1385
چهارشنبه 07 خرداد 1393, 21:20 عصر
الان اخطاری در مین‌اکتیویتی ظاهر نمیشه.

بعد از ران شدن هم برنامه مشکلی نداره.

اما با زدن دکمه بک، اخطاری ظاهر میشه، (بدبختانه، برنامه متوقف شده است) که دکمه اوکی دارد، و برنامه بسته میشه.

کد نهایی مین اکتیویتی اینه:



import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeList ener;


public class MainActivity extends FragmentActivity {


ViewPager myViewPager;
int index = 0;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

// Get the view from activity_main.xml
setContentView(R.layout.activity_main);

// پنهان کردن اکشن‌بار
getActionBar().hide();

ViewPager myViewPager1 = (ViewPager) findViewById(R.id.ViewPager_PlaceHolder);

MyFragmentPagerAdapter myAdapter = new MyFragmentPagerAdapter(getSupportFragmentManager() ,this);


myViewPager1.setAdapter(myAdapter);

// مشخص کردن این‌که کدام فرگمنت در آغاز برنامه نمایش داده شود
myViewPager1.setCurrentItem(0);

myViewPager1.setOnPageChangeListener(new OnPageChangeListener() {

@Override
public void onPageSelected(int arg0) {
}

@Override
public void onPageScrolled(int position, float arg1, int arg2) {
index = position;

}

@Override
public void onPageScrollStateChanged(int arg0) {
}
});
}

@Override
public void onBackPressed() {
if (index != 0) {
index = index - 1;
myViewPager.setCurrentItem(index);
return;
}
super.onBackPressed();
}
}


چیزی به نظرتان میرسه؟

ممنون

#root#
پنج شنبه 08 خرداد 1393, 00:20 صبح
چیزی به نظرتان میرسه؟
به شک افتادم بخاطر همین یه پروژه ساختم و کدها رو تست کردم ، به خوبی جواب داد ، مشکل هر چی هست مربوط به یه چیز دیگست.

sco1385
پنج شنبه 15 خرداد 1393, 19:22 عصر
الان این کد باید در داخل کلاسِ اصلی، و بالای "آن‌کری‌ایت" باشد:



ViewPager myViewPager;
int index = 0;


و این کد داخل "آن‌کری‌ایت":



// back stack
myViewPager1.setOnPageChangeListener(new OnPageChangeListener() {

@Override
public void onPageSelected(int arg0) {
}

@Override
public void onPageScrolled(int position, float arg1, int arg2) {
index = position;

}

@Override
public void onPageScrollStateChanged(int arg0) {
}
});


و این قسمت از کد هم یاید در بیرون از "آن‌کری‌ایت" باشد دیگه.



@Override
public void onBackPressed() {
if (index != 0) {
index = index - 1;
myViewPager.setCurrentItem(index);
return;
}
super.onBackPressed();

}



درسته؟

لطفاً ببینید کدها رو درست جاگذاری کردم؟

ممنون

sco1385
سه شنبه 20 خرداد 1393, 00:14 صبح
با تشکر از تمامی دوستان، به ویژه دوستان عزیز شاهین بهاری، روت، و روبیک، که بسیار کمک کردند.

الان این کد به درستی عمل می‌کند.

اما اشتباهی در این کدها وجود داشت که دوستم شاهین متوجه اشتباه من شدند. و پس از اصلاح، کدهای داده شده توسط دوستم روت به خوبی کار می‌کند.


اشتباه این بود که من در آغار ویوپیجر را این گونه تعریف کردم:



ViewPager myViewPager;


اما بعدا دوباره ویوپیجر را نادرست و به این صورتتعریف کردم:



ViewPager myViewPager1 = (ViewPager) findViewById(R.id.ViewPager_PlaceHolder);


ضمن اینکه، عدد یک هم اضافی بود، چون من آن را از اکتیوتی دیگر کپی کرده بودم.

تعریف باید این طور می‌بود:



myViewPager = (ViewPager) findViewById(R.id.ViewPager_PlaceHolder);


با تشکر، و عذرخواهی از این همه آزار عزیزان.

زنده باشید!