Tabs don't fit to screen with tabmode=scrollable, Even with a Custom Tab Layout

后端 未结 3 1652
轻奢々
轻奢々 2020-12-04 00:01

I have made a custom TabLayout with a ViewPager and am using the TabLayout in scrollable mode:

I need it to be scrollable as the number of dates can var

3条回答
  •  情深已故
    2020-12-04 01:01

    My solution is slightly different, since I tried the one above and it didn't work on some devices. I've noticed that if all tabs are visible on the screen and if we set tabMode to fixed, TabLayout fills its given width. When we use scrollable, TabLayout acts like its tabGravity is set to center.

    So, I calculate the sum of widths of all tabs in TabLayout and if it is lower than measured width I set its tabMode to MODE_FIXED, otherwise to MODE_SCROLLABLE:

    public class CustomTabLayout extends TabLayout {
    
        private static final String TAG = CustomTabLayout.class.getSimpleName();
    
        public CustomTabLayout(Context context) {
            super(context);
        }
    
        public CustomTabLayout(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
    
        public CustomTabLayout(Context context, AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
        }
    
        @Override
        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
            super.onMeasure(widthMeasureSpec, heightMeasureSpec);
            if (getTabCount() == 0)
                return;
            try {
                ViewGroup tabLayout = (ViewGroup)getChildAt(0);
                int widthOfAllTabs = 0;
                for (int i = 0; i < tabLayout.getChildCount(); i++) {
                    widthOfAllTabs += tabLayout.getChildAt(i).getMeasuredWidth();
                }
                setTabMode(widthOfAllTabs <= getMeasuredWidth() ? MODE_FIXED : MODE_SCROLLABLE);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    

提交回复
热议问题