Search code examples
androidandroid-viewpagerandroid-tablayout

Tab text disappeared with viewpager


A very simple example. I think most people implement a tab in this way. But the tab text is just missing.

Version of design support lib is the latest 24.2.0.

Here is my layout code:

<android.support.design.widget.TabLayout
    android:id="@+id/tabs"
    app:tabTextColor="@android:color/darker_gray"
    app:tabSelectedTextColor="@android:color/white"
    android:background="@color/colorPrimary"
    android:minHeight="?attr/actionBarSize"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <android.support.design.widget.TabItem
        android:text="@string/tab_domain"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <android.support.design.widget.TabItem
        android:text="@string/tab_upload"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <android.support.design.widget.TabItem
        android:text="@string/tab_download"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

</android.support.design.widget.TabLayout>

<android.support.v4.view.ViewPager
    android:id="@+id/pager"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

I'm using ButterKnife 8.2.1 to bind view objects. And here is my activity code in onCreate():

    final DiagnosePagerAdapter adapter = new DiagnosePagerAdapter(getSupportFragmentManager(),
            tabs.getTabCount());
    tabs.setupWithViewPager(pager);
    pager.setAdapter(adapter);
    pager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabs));

And here is my adapter:

    class DiagnosePagerAdapter extends FragmentStatePagerAdapter {
    int mNumOfTabs;
    List<Fragment> fragments = new ArrayList<>();

    public DiagnosePagerAdapter(FragmentManager fm, int numberOfTabs) {
        super(fm);
        this.mNumOfTabs = numberOfTabs;
        fragments.add(new DomainFragment());
        fragments.add(new UploadFragment());
        fragments.add(new DownloadFragment());
    }

    @Override
    public Fragment getItem(int position) {
        return fragments.get(position);
    }

    @Override
    public int getCount() {
        return mNumOfTabs;
    }
}

I've seen a similar question here: Using TabLayout inside a Fragment; tab text invisible

Answers in that question said this has been fixed in 23.0.0, and none of the workaround works on my phones, including a Xiaomi HM 2A and a Huawei device.


Solution

  • You must override getPageTitle()as below (I think this will solve your issue):

    @Override
        public CharSequence getPageTitle(int position) {
            switch (position) {
                case 0:
                    return "Domain";
                case 1:
                    return "Upload";
                case 2:
                    return "Download";
            }
            return null;
        }
    

    Also, as you have fixed number of tabs, you should use FragmentPagerAdapter instead of FragmentStatePagerAdapter. And then change your xml layout as below :

    <android.support.design.widget.TabLayout
        android:id="@+id/tabs"
        app:tabTextColor="@android:color/darker_gray"
        app:tabSelectedTextColor="@android:color/white"
        android:background="@color/colorPrimary"
        android:minHeight="?attr/actionBarSize"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>
    
    <android.support.v4.view.ViewPager
        android:id="@+id/pager"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
    

    Change your adapter as below :

    class DiagnosePagerAdapter extends FragmentPagerAdapter {
    
        public DiagnosePagerAdapter(FragmentManager fm) {
            super(fm);
        }
    
        @Override
        public Fragment getItem(int position) {
            Fragment fragment = null;
            switch (position) {
                case 0:
                    fragment = new DomainFragment();
                    break;
                case 1:
                    fragment = new UploadFragment();
                    break;
                case 2:
                    fragment = new DownloadFragment();
                    break;
            }
            return fragment;
        }
    
        @Override
        public int getCount() {
            return 3;
        }
    
        @Override
        public CharSequence getPageTitle(int position) {
            switch (position) {
                case 0:
                    return "Domain";
                case 1:
                    return "Upload";
                case 2:
                    return "Download";
            }
            return null;
        }
    
    }
    

    And change your onCreate() as below :

    final DiagnosePagerAdapter adapter = new DiagnosePagerAdapter(getSupportFragmentManager());
    pager.setAdapter(adapter);//call setAdapter() before setupWithViewPager()
    tabs.setupWithViewPager(pager);