Android Support Design TabLayout: Gravity Center and Mode Scrollable

前端 未结 13 2008

I am trying to use the new Design TabLayout in my project. I want the layout to adapt to every screen size and orientation, but it can be seen correctly in one orientation.<

13条回答
  •  不思量自难忘°
    2020-12-02 07:24

    This is the only code that worked for me:

    public static void adjustTabLayoutBounds(final TabLayout tabLayout,
                                             final DisplayMetrics displayMetrics){
    
        final ViewTreeObserver vto = tabLayout.getViewTreeObserver();
        vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
    
            @Override
            public void onGlobalLayout() {
    
                tabLayout.getViewTreeObserver().removeOnGlobalLayoutListener(this);
    
                int totalTabPaddingPlusWidth = 0;
                for(int i=0; i < tabLayout.getTabCount(); i++){
    
                    final LinearLayout tabView = ((LinearLayout)((LinearLayout) tabLayout.getChildAt(0)).getChildAt(i));
                    totalTabPaddingPlusWidth += (tabView.getMeasuredWidth() + tabView.getPaddingLeft() + tabView.getPaddingRight());
                }
    
                if (totalTabPaddingPlusWidth <= displayMetrics.widthPixels){
    
                    tabLayout.setTabMode(TabLayout.MODE_FIXED);
                    tabLayout.setTabGravity(TabLayout.GRAVITY_FILL);
    
                }else{
                    tabLayout.setTabMode(TabLayout.MODE_SCROLLABLE);
                }
    
                tabLayout.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT));
            }
        });
    }
    

    The DisplayMetrics can be retrieved using this:

    public DisplayMetrics getDisplayMetrics() {
    
        final WindowManager wm = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
        final Display display = wm.getDefaultDisplay();
        final DisplayMetrics displayMetrics = new DisplayMetrics();
    
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR1) {
            display.getMetrics(displayMetrics);
    
        }else{
            display.getRealMetrics(displayMetrics);
        }
    
        return displayMetrics;
    }
    

    And your TabLayout XML should look like this (don't forget to set tabMaxWidth to 0):

    
    

提交回复
热议问题