TabLayout tabs text not displaying

后端 未结 4 744
礼貌的吻别
礼貌的吻别 2020-12-08 13:05

I am using TabLayout inside a Fragment to display three fixed tabs and the tabs are working but it doesn\'t show the tab text even after I set the

相关标签:
4条回答
  • 2020-12-08 13:12

    I'm using Kotlin and have spent an hour to find the bugs with this code.

    var viewPager: ViewPager = view.findViewById(R.id.viewPager)
    
    ...
    
    adapter = TabAdapter(fragmentManager!!)
    adapter.addFragment(Fragment1(), "Fragment 1")
    adapter.addFragment(Fragment2(), "Fragment 2")
    
    viewPager.adapter = adapter
    
    tabLayout.setupWithViewPager(viewpager)
    

    I can compile this with no error, but the tab title is not showing until I realize the viewpager I assigned to the tabLayout is not viewPager (notice the capitalize 'P'). It's not producing error because kotlin will find any matching layout id, in this case "viewpager" which is a ViewPager but on another view.

    0 讨论(0)
  • 2020-12-08 13:16

    Thank you Hatem Badawi,

    I started developing in Java recently. I used WPF and XAML in .Net before and things are pretty different over there when it comes to UI design. Anyway I had the same issue. I wanted to define TabItem in XML instead of doing it programmatically. As you mentioned, this setupWithViewPager() call resets the text and icon of the tab items to null( It uses the same tab object, just resets its content). I used your approach but made it more reusable. Here is my code:

    public class TabLayoutUtil {
        public static void setupTabLayoutWithViewPager(TabLayout tabLayout, ViewPager viewPager) {
            ArrayList<Pair<CharSequence, Drawable>> tabsContentCopy= new ArrayList<>();
            for (int i = 0; i < tabLayout.getTabCount(); i++) {
                TabLayout.Tab tab = tabLayout.getTabAt(i);
                tabsContentCopy.add(new Pair<>(tab != null ? tab.getText() : null, tab != null ? tab.getIcon() : null));
            }
            tabLayout.setupWithViewPager(viewPager);
            for (int i = 0; i < tabLayout.getTabCount(); i++) {
                if (i<tabsContentCopy.size()) {
                    tabLayout.getTabAt(i).setText(tabsContentCopy.get(i).first);
                    tabLayout.getTabAt(i).setIcon(tabsContentCopy.get(i).second);
                }
            }
        }
    }
    
    0 讨论(0)
  • 2020-12-08 13:17

    The problem is you're calling setupWithViewPager() after setting up your tabs with the addTab() calls, effectively overwriting them.

    From the documentation of TabLayout regarding setupWithViewPager():

    The tabs displayed in this layout will be populated from the ViewPager adapter's page titles.

    If you would like to use your TabLayout with a ViewPager, you should override getPageTitle() in your PagerAdapter (and remove the addTab() calls, they are redundant).

    For example:

    public class ExamplePagerAdapter extends FragmentStatePagerAdapter {
    
        // tab titles
        private String[] tabTitles = new String[]{"Tab1", "Tab2", "Tab3"};
    
        public ExamplePagerAdapter(FragmentManager fm) {
            super(fm);
        }
    
        // overriding getPageTitle()
        @Override
        public CharSequence getPageTitle(int position) {
            return tabTitles[position];
        }
    
        @Override
        public Fragment getItem(int position) {
            switch (position) {
                case 0:
                    return new Tab1Fragment();
                case 1:
                    return new Tab2Fragment();
                case 2:
                    return new Tab3Fragment();
                default:
                    throw new RuntimeException("Invalid tab position");
            }
        }
    
        @Override
        public int getCount() {
            return tabTitles.length;
        }
    
        // ...
    }
    
    0 讨论(0)
  • 2020-12-08 13:36

    i added tab text and icon for each tab after calling tabs.setupWithViewPager(viewPager)

        viewPager.setAdapter(new MyViewAdapter(getSupportFragmentManager()));
        TabLayout tabs=(TabLayout) findViewById(R.id.tabs);
        tabs.setupWithViewPager(viewPager);
        tabs.getTabAt(0).setIcon(R.drawable.icon1);
        tabs.getTabAt(1).setIcon(R.drawable.icon2);
        tabs.getTabAt(0).setText(getResources().getText(R.string.tab1));
        tabs.getTabAt(1).setText(getResources().getText(R.string.tab2));
    
    0 讨论(0)
提交回复
热议问题