Tab not taking full width on Tablet device [Using android.support.design.widget.TabLayout]

前端 未结 12 2069
萌比男神i
萌比男神i 2020-11-28 17:39

I have setup tabs as UPDATE 29/05/2015 this post. Tabs take full width on my Nexus 4 mobile but on nexus 7 tablet it in center and not cover full screen wid

相关标签:
12条回答
  • 2020-11-28 18:23

    Check below code for solutions.

    Below is layout code:

    <com.yourpackage.CustomTabLayout
        android:id="@+id/tabs"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="@color/off_white"
        app:tabIndicatorColor="@color/primaryColor"
        app:tabIndicatorHeight="3dp"
        app:tabMode="scrollable"
        app:tabPaddingEnd="0dp"
        app:tabPaddingStart="0dp" />
    

    Note, for dynamic tab count, don't forget to call setTabNumbers(tabcount).

    import android.content.Context;
    import android.support.design.widget.TabLayout;
    import android.util.AttributeSet;
    import android.util.
    import java.lang.reflect.Field;
    
    public class CustomTabLayout extends TabLayout
    {
        private static final int WIDTH_INDEX = 0;
        private int DIVIDER_FACTOR = 3;
        private static final String SCROLLABLE_TAB_MIN_WIDTH = "mScrollableTabMinWidth";
    
        public CustomTabLayout(Context context) {
            super(context);
            initTabMinWidth();
        }
    
        public CustomTabLayout(Context context, AttributeSet attrs) {
            super(context, attrs);
            initTabMinWidth();
        }
    
        public CustomTabLayout(Context context, AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
            initTabMinWidth();
        }
    
        public void setTabNumbers(int num)
        {
            this.DIVIDER_FACTOR = num;
            initTabMinWidth();
        }
    
        private void initTabMinWidth()
        {
            int[] wh = getScreenSize(getContext());
            int tabMinWidth = wh[WIDTH_INDEX] / DIVIDER_FACTOR;
    
            Log.v("CUSTOM TAB LAYOUT", "SCREEN WIDTH = " + wh[WIDTH_INDEX] + " && tabTotalWidth = " + (tabMinWidth*DIVIDER_FACTOR) + " && TotalTabs = " + DIVIDER_FACTOR);
    
            Field field;
            try {
                field = TabLayout.class.getDeclaredField(SCROLLABLE_TAB_MIN_WIDTH);
                field.setAccessible(true);
                field.set(this, tabMinWidth);
            } catch (NoSuchFieldException e) {
                e.printStackTrace();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        private static final int WIDTH_INDEX = 0;
        private static final int HEIGHT_INDEX = 1;
    
        public static int[] getScreenSize(Context context) {
            int[] widthHeight = new int[2];
            widthHeight[WIDTH_INDEX] = 0;
            widthHeight[HEIGHT_INDEX] = 0;
    
            try {
                WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
                Display display = windowManager.getDefaultDisplay();
    
                Point size = new Point();
                display.getSize(size);
                widthHeight[WIDTH_INDEX] = size.x;
                widthHeight[HEIGHT_INDEX] = size.y;
    
                if (!isScreenSizeRetrieved(widthHeight))
                {
                    DisplayMetrics metrics = new DisplayMetrics();
                    display.getMetrics(metrics);
                    widthHeight[0] = metrics.widthPixels;
                    widthHeight[1] = metrics.heightPixels;
                }
    
                // Last defense. Use deprecated API that was introduced in lower than API 13
                if (!isScreenSizeRetrieved(widthHeight)) {
                    widthHeight[0] = display.getWidth(); // deprecated
                    widthHeight[1] = display.getHeight(); // deprecated
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
    
            return widthHeight;
        }
    
        private static boolean isScreenSizeRetrieved(int[] widthHeight) {
            return widthHeight[WIDTH_INDEX] != 0 && widthHeight[HEIGHT_INDEX] != 0;
        }
    }
    

    Reference taken from https://medium.com/@elsenovraditya/set-tab-minimum-width-of-scrollable-tablayout-programmatically-8146d6101efe

    0 讨论(0)
  • 2020-11-28 18:24

    In my variant of this problem, I had 3 tabs of moderate size which weren't taking up full width on tablets. I didn't need the tabs to be scrollable on tablets, since tablets are big enough to display the tabs all together without any scrolling. But I did need the tabs to be scrollable on phones, since phones are too small to display all the tabs together.

    The best solution in my case was to add a res/layout-sw600dp/main_activity.xml file, where the relevant TabLayout could have app:tabGravity="fill" and app:tabMode="fixed". But in my regular res/layout/main_activity.xml, I left out app:tabGravity="fill" and app:tabMode="fixed", and had app:tabMode="scrollable" instead.

    0 讨论(0)
  • 2020-11-28 18:27

    This is helpful you must try

     <android.support.design.widget.TabLayout
            android:id="@+id/tabs"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:tabMaxWidth="0dp"
            app:tabGravity="fill"
            app:tabMode="fixed"
            app:tabIndicatorColor="@color/white"
            app:tabSelectedTextColor="@color/white"
            app:tabTextColor="@color/orange" />
    
    0 讨论(0)
  • 2020-11-28 18:30

    Solution for Scrollable (Kotlin)

    In xml:

         <com.google.android.material.tabs.TabLayout
                android:id="@+id/home_tab_layout"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                app:tabMaxWidth="0dp"
                app:tabMode="scrollable"
                android:fillViewport="true"
                app:tabGravity="fill" />
    

    In Kotlin:

    In my case if less than 3 tabs I allocate equal space.

    Note: If condition is as per your requirement

            if(list.size <= 3){
              allotEachTabWithEqualWidth(your_tab_layout)
            }
    
         fun allotEachTabWithEqualWidth(tabLayout: TabLayout) {
            mTabLayout.tabMode=  TabLayout.MODE_FIXED
            val slidingTabStrip = tabLayout.getChildAt(0) as ViewGroup
            for (i in 0 until tabLayout.getTabCount()) {
                val tab = slidingTabStrip.getChildAt(i)
                val layoutParams = tab.layoutParams as LinearLayout.LayoutParams
                layoutParams.weight = 1f
                tab.layoutParams = layoutParams
            }
    
        }
    
    0 讨论(0)
  • 2020-11-28 18:30

    Why all that hectic work ? Just put app:tabMode="scrollable" in your TabLayout in XML. Thats it.

    0 讨论(0)
  • 2020-11-28 18:36

    Please note that you also need to set

      app:tabPaddingStart="-1dp"
      app:tabPaddingEnd="-1dp"
    

    to fill all space

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