Android Support Design TabLayout: Gravity Center and Mode Scrollable

前端 未结 13 1992

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:18

    All you need is to add the following to your TabLayout

    custom:tabGravity="fill"
    

    So then you'll have:

    xmlns:custom="http://schemas.android.com/apk/res-auto"
    <android.support.design.widget.TabLayout
            android:id="@+id/tabs"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            custom:tabGravity="fill"
            />
    
    0 讨论(0)
  • 2020-12-02 07:18

    I solved this using following

    if(tabLayout_chemistCategory.getTabCount()<4)
        {
            tabLayout_chemistCategory.setTabGravity(TabLayout.GRAVITY_FILL);
        }else
        {
            tabLayout_chemistCategory.setTabMode(TabLayout.MODE_SCROLLABLE);
    
        }
    
    0 讨论(0)
  • 2020-12-02 07:23

    Tab gravity only effects MODE_FIXED.

    One possible solution is to set your layout_width to wrap_content and layout_gravity to center_horizontal:

    <android.support.design.widget.TabLayout
        android:id="@+id/sliding_tabs"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        app:tabMode="scrollable" />
    

    If the tabs are smaller than the screen width, the TabLayout itself will also be smaller and it will be centered because of the gravity. If the tabs are bigger than the screen width, the TabLayout will match the screen width and scrolling will activate.

    0 讨论(0)
  • 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):

    <android.support.design.widget.TabLayout
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:id="@+id/tab_layout"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:tabMaxWidth="0dp"/>
    
    0 讨论(0)
  • 2020-12-02 07:25

    As I didn't find why does this behaviour happen I have used the following code:

    float myTabLayoutSize = 360;
    if (DeviceInfo.getWidthDP(this) >= myTabLayoutSize ){
        tabLayout.setTabMode(TabLayout.MODE_FIXED);
    } else {
        tabLayout.setTabMode(TabLayout.MODE_SCROLLABLE);
    }
    

    Basically, I have to calculate manually the width of my tabLayout and then I set the Tab Mode depending on if the tabLayout fits in the device or not.

    The reason why I get the size of the layout manually is because not all the tabs have the same width in Scrollable mode, and this could provoke that some names use 2 lines as it happened to me in the example.

    0 讨论(0)
  • 2020-12-02 07:25

    Look at android-tablayouthelper

    Automatically switch TabLayout.MODE_FIXED and TabLayout.MODE_SCROLLABLE depends on total tab width.

    0 讨论(0)
提交回复
热议问题