سوال در مورد TabsPager(حل شد)
با سلام:
من چه کار کنم که صفحه اول به بعد درست اجرا بشه؟ الان در HomeFragment یه toast میزارم و در ProductFragment هم یه toast دیگه. وقتی برنامه اجرا میشه دو تا toast هم اجرا میشه.
public class TabsPagerAdapter extends FragmentPagerAdapter {
public TabsPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
switch (position) {
case 0:
// Home fragment activity
return new HomeFragment();
case 1:
// Products fragment activity
return new ProductsFragment();
case 2:
// Gallery fragment activity
return new GalleryFragment();
case 3:
// Services fragment activity
return new ServicesFragment();
case 4:
// Representative fragment activity
return new RepresentativeFragment();
case 5:
// Contact Us fragment activity
return new ContactUsFragment();
default:
return null;
}
}
@Override
public int getCount() {
// get item count - equal to number of tabs
return 6;
}
}
سلام، همونطوری که دوستان گفتن این خاصیت ویو پیجر هست که صفحات قبلی و بعدی رو لود میکنه، برای اینکه بیشتر از 2 صفحه رو لود کنید میتونید از کد زیر استفاده کنید، ولی برای کمتر جواب نمیده:
viewPager.setOffscreenPageLimit(1);
برای اینکه به صفحه مورد نظر برید کافیه کد زیر رو بزنید
viewPager.setCurrentItem(pageNumber - 1);
برای این کار میتونید کد بالا رو بزنید و آداپتر رو با دیتای برعکس setAdapter کنیم.
برای اینکه یکسری دستورات فقط زمانی که صفحه مورد نظر باز شد انجام بشه، کار یکم پیچیدست ولی من روش رو میگم.
توی اکتیویتی باید از متد زیر استفاده کنید.
اگر از PagerIndicator استفاده نمیکنید باید ویو پیجر کاستوم خودتون رو بسازید و متد های زیر رو override کنید:
pagerIndicator.setOnPageChangeListener(new OnPageChangeListener() {
@Override
public void onPageSelected(int position) {
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
}
@Override
public void onPageScrollStateChanged(int arg0) {
}
});
خوب توی onPageSelected مقدار position رو به ما میده، از اینجا به بعد بستگی به معماری پیاده سازی خودتون داره، من 2 راه حل براتون میگم شما میتونید یکی رو انتخاب کنید.
1: یک متد توی آداپتر بسازید، یک متد هم توی فرگمنتتون. زمانی که position به اون متد رسید اون متد (متد توی فرگمنت) رو کال کنید.(مثلا میتونه دانلود فایل، تغییر رنگ و ... باشه)
نکته: به هیچ وجه هیچی رو استاتیک ست نکنید و اصلا سعی نکنید از توی اکتیویتی به فرگمنت دسترسی داشته باشید.
سطح دسترسی باید سلسله مراتبی باشه یعنی: اکتیویتی، اداپتر، فرگمنت، متد درون فرگمنت
2: استفاده از لیستنر ها. شما در اکتیویتی یک لیستنر میسازید و اونو پاس میدید به آداپتر، از آداپتر هم پاس میدید به فرگمنت. تفاوت این روش اینه که کد هایی که میخواید اجرا بشن، توی اکتیویتی نوشته میشه.(بسته به نوع پیاده سازی، ممکنه نیاز به این روش داشته باشید ولی من پیشنهاد نمیکنم)
اگر سوالی دارید بپرسید حتما جواب میدم، ولی چون شرکت یکم محدودیت هامون زیاد شده ممکنه یکم دیر جواب بدم.
موفق باشید
نکته:
میتونید به جای ساختن یک متد توی فرگمنتتون از یک متغیر و یک Switch توی onViewCreated استفاده کنید.
به این صورت که ما توی آداپتر position رو به فرگمنت ارسال میکنیم و توی فرگمنت اونو توی Switch میذاریم.
ارسال دیتا به فرگمنت عین اکتیویتی نیست. به صورت زیر عمل کنید
این متد رو مینویسید و وقتی میخواید فرگمنت رو بسازید، فقط این متد رو کال میکنی(حتما توجه داشته باشید که خود این متد فرگمنت رو یکبار میسازه، پس شما توی آداپتر اصلا نباید فرگمنت بسازید و فقط باید این متد رو کال کنید، مگرنه 2 تا فرگمنت ساخته میشه)
public static MyFragment newInstance(int position) {
MyFragment fragment = new MyFragment();
Bundle bundle = new Bundle();
bundle.putInt("pos", position);
fragment.setArguments(bundle);
return fragment;
}
بعد برای گرفتن مقادیر در OnCreated:
if(getArguments() != null) {
position = getArguments().getInt("pos");
}
Switch(position){
case 0:{
}
}
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .