TabLayout tab selection

前端 未结 25 1460
情深已故
情深已故 2020-11-29 17:15

How should I select a tab in TabLayout programmatically?

 TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);
 tabLayout.setupWithViewPager(viewPager         


        
相关标签:
25条回答
  • 2020-11-29 17:30

    With the TabLayout provided by the Material Components Library just use the selectTab method:

    TabLayout tabLayout = findViewById(R.id.tab_layout);
    tabLayout.selectTab(tabLayout.getTabAt(index));
    

    It requires version 1.1.0.

    0 讨论(0)
  • 2020-11-29 17:34

    If it so happens that your default tab is the first one(0) and you happen to switch to a fragment, then you must manually replace the fragment for the first time. This is because the tab is selected before the listener gets registered.

    private TabLayout mTabLayout;
    
    ...
    
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_tablayout, container, false);
        mTabLayout = view.findViewById(R.id.sliding_tabs);
        mTabLayout.addOnTabSelectedListener(mOnTabSelectedListener);
    
        getActivity().getSupportFragmentManager().beginTransaction()
            .replace(R.id.tabContent, MyFirstFragment.newInstance()).commit();
        return view;
    }
    

    Alternatively, you can consider calling getTabAt(0).select() and overriding onTabReselected like so:

    @Override
    public void onTabReselected(TabLayout.Tab tab) {
        // Replace the corresponding tab fragment.
    }
    

    This would work because you are essentially replacing the fragment on every tab reselect.

    0 讨论(0)
  • 2020-11-29 17:35

    This is probably not the ultimate solution, and it requires that you use the TabLayout together with a ViewPager, but this is how I solved it:

    void selectPage(int pageIndex)
    {
        viewPager.setCurrentItem(pageIndex);
        tabLayout.setupWithViewPager(viewPager);
    }
    

    I tested how big the performance impact of using this code is by first looking at the CPU- and memory monitors in Android Studio while running the method, then comparing it to the load that was put on the CPU and memory when I navigated between the pages myself (using swipe gestures), and the difference isn't significantly big, so at least it's not a horrible solution...

    Hope this helps someone!

    0 讨论(0)
  • 2020-11-29 17:37

    Use this:

    <android.support.design.widget.TabLayout
        android:id="@+id/patienthomescreen_tabs"
        android:layout_width="match_parent"
        android:layout_height="72sp"
        app:tabGravity="fill"
        app:tabMode="fixed"
        app:tabIndicatorColor="@android:color/white"
        app:tabSelectedTextColor="@color/green"/>
    

    After in OnClickListener:

    TabLayout tabLayout = (TabLayout) findViewById(R.id.patienthomescreen_tabs);
    TabLayout.Tab tab = tabLayout.getTabAt(someIndex);
    tab.select();
    
    0 讨论(0)
  • 2020-11-29 17:37

    A bit late but might be a useful solution. I am using my TabLayout directly in my Fragment and trying to select a tab quite early in the Fragment's Lifecycle. What worked for me was to wait until the TabLayout finished drawing its child views by using android.view.View#post method. i.e:

    int myPosition = 0;
    myFilterTabLayout.post(() -> { filterTabLayout.getTabAt(myPosition).select(); });
    
    0 讨论(0)
  • 2020-11-29 17:37

    You can try solving it with this:

    TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);
    tabLayout.setupWithViewPager(mViewPager);
    
    TabLayout.Tab tab = tabLayout.getTabAt(pos);
    if (tab != null) {
        tab.select();
    }
    
    0 讨论(0)
提交回复
热议问题