Not: Bu yazı ViewPager içerisinde fragment kullanımı ve TabLayout’la ilişkilendirmek üzerinedir.
*You can reach same content from here in English.
ViewPager kullanırken üst kısımda verilen başlık bilgisiyle alt kısımda yer alan content’i ilişkilendirmek için farklı yöntemler kullanılabilir. Actionbar, TabLayout, PagerTabStrip, PagerTitleStrip kullanımı seçenekler arasında yer alacaktır.
PagerTabStrip ve PagerTitleStrip için Android 23.0.0’da raporlanan bir bug bulunmaktadır. İlk açılışda title bilgisini göstermemektedir. Ama yine de kullanmak isterseniz, linkdeki anlatımı çok yeterli ve anlaşılır buldum. Bu kaynaktan faydalanabilirsiniz.
Kullanacağınız Activity’nin layoutuna aşağıdaki gibi TabLayout ve ViewPager’ı ekleyebilirsiniz.
<LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <android.support.design.widget.TabLayout android:id="@+id/tabLayout" android:layout_width="match_parent" android:layout_height="wrap_content" /> <ViewPager android:id="@+id/viewPager" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="1"></ViewPager> </LinearLayout>
ViewPager’da Fragmentlerin kullanımı için support lib’de yer alan PagerAdapter’dan extend eden FragmentPagerAdapter yer almakta. ViewPager’ı ve TabLayout’u aşağıdaki gibi implement edebilirsiniz.
TabLayout tabLayout = (TabLayout)findViewById(R.id.tabLayout); ViewPager viewPager = (ViewPager)findViewById(R.id.viewPager); viewPager.setAdapter(new CustomFragmentPagerAdapter(getSupportFragmentManager())); viewPager.setCurrentItem(2); tabLayout.setupWithViewPager(viewPager); tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { @Override public void onTabSelected(TabLayout.Tab tab) { // TODO : Something } @Override public void onTabUnselected(TabLayout.Tab tab) { } @Override public void onTabReselected(TabLayout.Tab tab) { } }); viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageSelected(int position) { // TODO : Something } @Override public void onPageScrollStateChanged(int state) { } });
private class CustomFragmentPagerAdapter extends FragmentPagerAdapter{ Fragment1 fragment1; Fragment2 fragment2; Fragment3 fragment3; public CustomFragmentPagerAdapter(android.support.v4.app.FragmentManager fm){ super(fm); } @Override public Fragment getItem(int position) { if(position == 0){ if(fragment1 == null){ fragment1 = Fragment1.getInstance(); } return fragment1; }else if(position == 1){ if(fragment2 == null){ fragment2 = Fragment2.getInstance(); } return fragment2; }else if(position == 2){ if(fragment3 == null){ fragment3 = Fragment3.getInstance(); } return fragment3; }else{ return null; } } @Override public CharSequence getPageTitle(int position) { return "Title - " + String.valueOf(position); } @Override public int getCount() { return 3; } }
Burada önemli olan nokta aslında, sayfada mesela sayfada 1 adet fragment görünürken yanlarındaki bir önündeki ve bir arkasındaki fragment de aslında aynı anda yaratılır. Eğer data çekerek beslemeniz gereken bir durum varsa, ilk aşamada fragment’ini boş olarak create edip, tabdan select edildiğinde ya da page scroll edildiğinde, dışardan erişebileceğiniz örneğin refresh gibi bir methodla içini doldurmak olacaktır.
Bir diğer yandan fragmentler instance olarak dursalar bile aslında, arka tarafta çalışan mekanizmada başka bir fragmente scroll edildiğinde diğeri detroy edilir. Bu durumda, aslında bizim fragmentimiz initialize edilirken, yeniden layoutu yüklenecektir anlamına gelmektedir. Eğer farklı olarak yapmanız gereken bir durum varsa, layout inflate edildikten sonra çağrılan onViewCreated() methodunu dikkate almak olacaktır.
Örnek kodu, adresinden indirebilirsiniz. İyi çalışmalar.. 🙂
Keşke türkçe yerine ingilizce yazsaydın. Yada chicken translate yapmasaydın….
Çok faydalı oldu. Teşekkürler.