آموزش های این وب سایت به صورت رایگان در دسترس است. اطلاعات بیشتر
بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]

سوال در مورد TabsPager(حل شد)

علی  10 سال پیش  10 سال پیش
+1 0

با سلام:

من چه کار کنم که صفحه اول به بعد درست اجرا بشه؟ الان در 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;
	}

}

 

0 0
لطفا یکی راهنمایی کنه خیلی فورس ماژول هستش ... (10 سال پیش)
+1 0
علتش به خاصیت FragmentPagerAdapter برمیگرده (قبلا راجب تفاوتش با مورد بعدی که مینویسم مطالبی نوشته شده تو سایت) یا باید از FragmentStatePagerAdapter که تنها یک مورد رو لود میکنه استفاده کنید یا این لینک یا و یه راه دیگه که بعد میگم (در صورت جواب نگرفتنتون) (10 سال پیش)
0 0
Spirit جان من گذاشتم اینو کار نکرد ;(viewPager.setOffscreenPageLimit(0 . از FragmentStatePagerAdapter فک کنم به دلایلی نتونم ازش استفاده کنم چون نمیدونم چطور رنگ title bar رو تغییر بدم. لطف کن راه دیگه ای بگو . ممنون (10 سال پیش)
+1 0
مگه تغییر رنگی که گفتی ارتباطی به Adapter داره؟ - فقط کلاس رو بجای FragmentPagerAdapter از FragmentStatePagerAdapter مشتق (extend) باید بکنی تغییر دیگه ای فک نکنم لازم باشه - اون راه هم لحظه ای به فکرم اومد تست کردم جواب نداد. (10 سال پیش)
0 0
sprit جان FragmentStatePagerAdapter رو extends کردم اما بی فایده بود :( (10 سال پیش)
+2 0
فک کنم جناب حاج حسینی راه حل هایی داشته باشن، امیدوارم تا دوشنبه شب که برمیگردم حل شده باشه مشکلتون :) (10 سال پیش)
0 0
Sprit جان فکر کنم حاج حسینی نیست که جواب بده . (10 سال پیش)
+2 0
خب این خاصیت ویو پیجر هست که تا یک صفحه سمت راست و چپش رو هم لود میکنه اگر میخواید موقع نمایش صفحه Toast بیاد باید یه متد بنویسی و هر زمان که صفحه عوض شد صداش بزنی (10 سال پیش)
0 0
یعنی در صفحه اول بخوام اخبار رو از سرور لود کنم و در صفحه دوم یه چیز دیگه لود کنم به چه شکل اجرا میشه؟ نحوه اجراش چطور میشه محمد حسین جان؟ (10 سال پیش)
+2 0
شما کدت رو به صورت عادی مینویسی ولی ویو پیجر صفحه اول رو لود میکنه بعد اگر سمت راستش صفحه ای باشه اونم لود میکنه و همینطور سمت چپ علت اینکه Toast نمایش داده میشه همین هست. (10 سال پیش)
0 0
اها گرفتم ممنون محمد حسین جان. راستی میشه از راست به چپ tab ها باز بشه یا این امکان رو نداره؟ (10 سال پیش)
+2 0
خونه ای که مد نظرت هست نمایش داده بشه رو بهش باید با متد خاصی بگی که الان یادم نیس چیه بهش میگی همون صفحه رو به عنوان صفحه اصلی باز میکنه . (10 سال پیش)
0 0
محمد حسین عزیز اگر این متد یادتون اومد حتما بهمون بگید . ممنون میشیم منتظریم ... (10 سال پیش)
0 0
محمد حسین یک سوال دیگه میشه کاری کرد که تب ها یکسان باشند تقریبا مثل وات ساپ ؟ (10 سال پیش)
 برای این سوال 2 پاسخ وجود دارد.
پاسخ به سوال 
Hajhosseini  10 سال پیش
+3 0

سلام، همونطوری که دوستان گفتن این خاصیت ویو پیجر هست که صفحات قبلی و بعدی رو لود میکنه، برای اینکه بیشتر از 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: استفاده از لیستنر ها. شما در اکتیویتی یک لیستنر میسازید و اونو پاس میدید به آداپتر، از آداپتر هم پاس میدید به فرگمنت. تفاوت این روش اینه که کد هایی که میخواید اجرا بشن، توی اکتیویتی نوشته میشه.(بسته به نوع پیاده سازی، ممکنه نیاز به این روش داشته باشید ولی من پیشنهاد نمیکنم)
اگر سوالی دارید بپرسید حتما جواب میدم، ولی چون شرکت یکم محدودیت هامون زیاد شده ممکنه یکم دیر جواب بدم.
موفق باشید

پاسخ به سوال 
Hajhosseini  10 سال پیش
+1 0

نکته:
میتونید به جای ساختن یک متد توی فرگمنتتون از یک متغیر و یک 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:{

            }
        }

پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .