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.. 🙂