แท็บไม่ใช้ความกว้างเต็มบนแท็บเล็ต [ใช้ android.support.design.widget.TabLayout]


203

ฉันมีแท็บการตั้งค่าเป็นUPDATE 29/05/2015 นี้โพสต์ แท็บใช้ความกว้างเต็มบนมือถือ Nexus 4 ของฉัน แต่ใช้แท็บเล็ต Nexus 7 ที่อยู่ตรงกลางและไม่ครอบคลุมความกว้างเต็มหน้าจอ

ภาพหน้าจอ Nexus 7 ภาพหน้าจอ Nexus7 Nexus 4 Nexus 4


กำลังดิ้นรนกับปัญหาเดียวกันที่แน่นอนเป็นเวลา 6 ชั่วโมง แต่ฉันไม่ได้ตระหนักว่ามันมีปัญหากับแท็บเท่านั้น ... คิดว่าใน stackoverflow ควรมีฟังก์ชั่นในการ upvote คำถาม 10 ครั้ง ...
Shirish Herwade

โปรดลองเพิ่มแท็กให้กับคำถาม ... (จะมีประโยชน์มากกว่าสำหรับคนอย่างฉัน) เพราะคำถามนี้ฉันพบในหน้าสามของรายการค้นหา google ของฉัน
Shirish Herwade

คำตอบ:


596

คำตอบ "เรียบง่าย" ที่ยืมมาจาก Kaizieจะเพิ่มapp:tabMaxWidth="0dp"ในTabLayoutxml ของคุณ:

<android.support.design.widget.TabLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:tabMaxWidth="0dp"
            app:tabGravity="fill"
            app:tabMode="fixed" />

19
จะทำอย่างไรถ้าฉันต้องการให้เลื่อนได้ การเปลี่ยนแท็บโหมดเพื่อสนับสนุนการเลื่อนแบ่งโซลูชันนี้
Tiago

3
วิธีการแก้ปัญหาสำหรับเลื่อนได้?
sunlover3

5
สวัสดี .. ฉันได้ลองเพิ่มสิ่งนี้แล้ว แต่แท็บเดียวไม่ได้ใช้ความกว้างทั้งหมดของเค้าโครงแท็บ
Surinder

3
วิธีนี้ยังใช้งานได้หาก tabMode ไม่ได้ตั้งค่า TapMode แบบเลื่อนได้ไม่ปรากฏขึ้นเพื่อรองรับคุณสมบัติของแรงโน้มถ่วงที่เต็มไปและความกว้างสูงสุด 0dp
Julio Mendoza

3
ทำไมถึงเกิดขึ้น มันเป็นพฤติกรรมเริ่มต้นหรือไม่ หรือบางอย่างที่ฉันใช้ไม่ดี เป็นส่วนหนึ่งของแนวทางในการตั้งแท็บที่กึ่งกลางหรือไม่ สิ่งนี้ไม่ได้เกิดขึ้นกับฉันเมื่อใช้แท็บ 3+ สำหรับ 2 แท็บเท่านั้น
นักพัฒนา android

91

ฉันมีปัญหาเดียวกันและฉันตรวจสอบสไตล์ TabLayout และฉันพบว่ารูปแบบเริ่มต้นของมันคือWidget.Design.TabLayoutซึ่งมีการใช้งานที่แตกต่างกัน (ปกติแนวนอนและ sw600dp)

สิ่งที่เราต้องการคืออันสำหรับแท็บเล็ต (sw600dp) ซึ่งมีการนำไปใช้ดังนี้:

<style name="Widget.Design.TabLayout" parent="Base.Widget.Design.TabLayout">
        <item name="tabGravity">center</item>
        <item name="tabMode">fixed</item>
 </style>

จากรูปแบบนี้เราจะใช้ " tabGravity " (ซึ่งค่าที่เป็นไปได้คือ "กลาง" หรือ "เติม") โดยใช้ค่า "เติม"

แต่เราจำเป็นต้องไปลึกแล้วเราจะเห็นว่าคนนี้ยื่นออกมาจากBase.Widget.Design.TabLayoutที่ดำเนินการคือ

<style name="Base.Widget.Design.TabLayout" parent="android:Widget">
    <item name="tabMaxWidth">@dimen/tab_max_width</item>
    <item name="tabIndicatorColor">?attr/colorAccent</item>
    <item name="tabIndicatorHeight">2dp</item>
    <item name="tabPaddingStart">12dp</item>
    <item name="tabPaddingEnd">12dp</item>
    <item name="tabBackground">?attr/selectableItemBackground</item>
    <item name="tabTextAppearance">@style/TextAppearance.Design.Tab</item>
    <item name="tabSelectedTextColor">?android:textColorPrimary</item>
</style>

ดังนั้นจากรูปแบบนี้เราจะต้องแทนที่ " tabMaxWidth " ในกรณีของฉันฉันตั้งมัน0dpดังนั้นจึงไม่มีข้อ จำกัด

และสไตล์ของฉันดูเหมือนว่า:

<style name="MyTabLayout" parent="Widget.Design.TabLayout">
        <item name="tabGravity">fill</item>
        <item name="tabMaxWidth">0dp</item>
</style>

จากนั้นแถบแท็บจะเต็มหน้าจอจากด้านหนึ่งไปอีกด้านหนึ่ง


1
การค้นพบที่ดี .. ไปที่ราก แต่โปรดเน้นคำตอบที่ถูกต้องที่ด้านบนมันจะง่ายกว่าที่จะหาคนที่ไม่ต้องการอ่านคำตอบทั้งหมด
Shirish Herwade

ทางออกที่ดีแปลกที่ api ดูเหมือนว่าคุณสามารถควบคุมได้โดยไม่ต้องเปลี่ยนสไตล์พื้นฐาน ดูเหมือนว่า tabMaxWidth เป็นผู้ร้ายตัวจริง
kandroidj

3
นี่เป็นเหมือนตอนของ Sherlock ขอบคุณ!!
Lisa Wray

29

โซลูชันสำหรับเลื่อนได้: (TabLayout.MODE_SCROLLABLE) นั่นคือเมื่อคุณต้องการมากกว่า 2 แท็บ (แท็บไดนามิก)

ขั้นตอนที่ 1: style.xml

<style name="tabCustomStyle" parent="Widget.Design.TabLayout">
            <item name="tabGravity">fill</item>
            <item name="tabMaxWidth">0dp</item>
            <item name="tabIndicatorColor">#FFFEEFC4</item>
            <item name="tabIndicatorHeight">2dp</item>
            <item name="tabTextAppearance">@style/MyCustomTabTextAppearance</item>
            <item name="tabSelectedTextColor">#FFFEEFC4</item>
        </style>

        <style name="MyCustomTabTextAppearance" parent="TextAppearance.Design.Tab">
            <item name="android:textSize">@dimen/tab_text_size</item>
            <item name="android:textAppearance">@style/TextAppearance.roboto_medium</item>
            <item name="textAllCaps">true</item>
        </style>
        <style name="TextAppearance.roboto_medium" parent="android:TextAppearance">
            <item name="android:fontFamily">sans-serif-medium</item>
        </style>

ขั้นตอนที่ 2: เค้าโครง xml ของคุณ

<android.support.design.widget.TabLayout
            android:id="@+id/sliding_tabs"
            style="@style/tabCustomStyle"
            android:layout_width="match_parent"
            android:layout_height="@dimen/tab_strip_height"
            android:background="@color/your_color"
            app:tabMode="scrollable"
            app:tabTextColor="@color/your_color" />

ขั้นตอนที่ 3: ในกิจกรรม / ชิ้นส่วนที่คุณเคยมีแท็บ

/**
     * To allow equal width for each tab, while (TabLayout.MODE_SCROLLABLE)
     */
    private void allotEachTabWithEqualWidth() {

        ViewGroup slidingTabStrip = (ViewGroup) mTabLayout.getChildAt(0);
        for (int i = 0; i < mTabLayout.getTabCount(); i++) {
            View tab = slidingTabStrip.getChildAt(i);
            LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) tab.getLayoutParams();
            layoutParams.weight = 1;
            tab.setLayoutParams(layoutParams);
        }

    }

สิ่งนี้ใช้ได้เฉพาะกับแท็บมากกว่า 1 แท็บหากเรามีแท็บเดียวเท่านั้นแท็บจะไม่เติมเค้าโครงของแท็บ ในการแก้ปัญหานั้นฉันได้เพิ่มแอพ: tabMaxWidth = "1000dp" และใช้งานได้
jzeferino

สิ่งนี้ใช้ได้ผลดีที่สุดสำหรับฉัน ในคลาสเลย์เอาต์แท็บที่กำหนดเองของฉันฉันข้ามaddTabและตั้งค่าน้ำหนักสำหรับแต่ละแท็บเมื่อเพิ่ม override fun addTab(tab: Tab, position: Int, setSelected: Boolean) { super.addTab(tab, position, setSelected) allotEachTabWithEqualWidth() }
Justin Lee

15

หากต้องการบังคับให้แท็บรับความกว้างเต็ม (แบ่งเป็นขนาดเท่ากัน) ให้ใช้ดังต่อไปนี้กับTabLayoutมุมมอง:

TabLayout tabLayout = (TabLayout) findViewById(R.id.your_tab_layout);
tabLayout.setTabGravity(TabLayout.GRAVITY_FILL);
tabLayout.setTabMode(TabLayout.MODE_FIXED);

2
เพียงแค่ให้คนรู้ว่าสิ่งนี้จะไม่ทำงานหากคุณTabLayoutตั้งค่าไว้app:tabMode=“scrollable”มันจะส่งผลให้แท็บกลายเป็นความยาวคงที่ (คำยาวจะล้อมรอบ) และแท็บจะไม่เลื่อนอีกต่อไปทำให้แท็บ "คงที่" อีกครั้ง
Sakiboy

5

สิ่งนี้มีประโยชน์ที่คุณต้องลอง

 <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" />

4
<android.support.design.widget.TabLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:tabMaxWidth="0dp"
            app:tabGravity="fill"
            app:tabMode="fixed" />

ทำงานให้ฉัน สิ่งนี้ก็มีxmlns:app="http://schemas.android.com/apk/res-auto"


3

สำหรับฉันรหัสต่อไปนี้ทำงานและก็เพียงพอ

<android.support.design.widget.TabLayout
        android:id="@+id/tabs"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:tabGravity="fill"/>

2

ตรวจสอบรหัสด้านล่างเพื่อดูวิธีแก้ไข

ด้านล่างคือรหัสเลย์เอาต์:

<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" />

หมายเหตุสำหรับการนับแท็บแบบไดนามิกอย่าลืมเรียก 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;
    }
}

การอ้างอิงนำมาจากhttps://medium.com/@elsenovraditya/set-tab-minimum-width-of-scrollable-tablayout-programmatically-8146d6101efe


2

โซลูชันสำหรับเลื่อนได้ (Kotlin)

ใน 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" />

ใน Kotlin:

ในกรณีของฉันถ้าน้อยกว่า 3 แท็บฉันจัดสรรพื้นที่เท่ากัน

หมายเหตุ: หากเงื่อนไขเป็นไปตามความต้องการของคุณ

        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
        }

    }

1

ทำไมสิ่งที่น่าตื่นเต้น เพียงใส่app:tabMode="scrollable"TabLayout ใน XML แค่นั้นแหละ.

ป้อนคำอธิบายรูปภาพที่นี่


1
เกิดอะไรขึ้นถ้ามี 3 แท็บ? ที่จะไม่พอดีกับหน้าจอ (แท็บเป็นแบบไดนามิกที่มาจากเซิร์ฟเวอร์ API) แท็บนับเป็นที่รู้จักกันในเวลาทำงาน ..
ราม Prakash Bhat

จากนั้นคุณสามารถตั้งโปรแกรมแบบนี้ได้tabLayout.setTabMode(TabLayout.MODE_SCROLLABLE);อีกทั้งนี่เป็นเพียงคุณสมบัติที่ตั้งไว้สำหรับ tabLayout สิ่งนี้ไม่สำคัญว่าจะมีกี่แท็บที่คุณเพิ่มทั้งแบบคงที่หรือแบบไดนามิก
Ali Akram

มันจะทำให้ความกว้างแท็บตามขนาดตัวอักษรตรวจสอบคำตอบของฉันแก้ไขด้วยภาพ
Ali Akram

ยาในโหมดแท็บกรณีนั้นคือเลื่อนแล้วในตอนท้ายคุณจะเห็นพื้นที่ว่างที่ดูแปลก
ราม Prakash Bhat

1

ในตัวแปรของฉันของปัญหานี้ฉันมี 3 แท็บที่มีขนาดปานกลางซึ่งไม่ได้ทำให้เต็มความกว้างของแท็บเล็ต ฉันไม่ต้องการให้แท็บเลื่อนบนแท็บเล็ตเนื่องจากแท็บเล็ตมีขนาดใหญ่พอที่จะแสดงแท็บทั้งหมดเข้าด้วยกันโดยไม่ต้องเลื่อน แต่ฉันต้องการแท็บที่สามารถเลื่อนได้บนโทรศัพท์เนื่องจากโทรศัพท์มีขนาดเล็กเกินไปที่จะแสดงแท็บทั้งหมดด้วยกัน

ทางออกที่ดีที่สุดในกรณีของฉันคือการเพิ่มres/layout-sw600dp/main_activity.xmlไฟล์ที่ TabLayout ที่เกี่ยวข้องอาจมีและapp:tabGravity="fill" app:tabMode="fixed"แต่ในความปกติของฉันres/layout/main_activity.xmlฉันซ้ายออกapp:tabGravity="fill"และapp:tabMode="fixed"และมีapp:tabMode="scrollable"แทน


-1

โปรดทราบว่าคุณต้องตั้งค่า

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

เพื่อเติมเต็มพื้นที่ทั้งหมด


ยินดีต้อนรับสู่ Stack Overflow กรุณาใช้ทัวร์ นี่เป็นเว็บไซต์คำถามและคำตอบไม่ใช่ฟอรัมสนทนา ส่วนนี้มีไว้สำหรับคำตอบที่สมบูรณ์เท่านั้น เมื่อคุณได้รับ 50 คะแนนชื่อเสียงโดยการถามและตอบคุณจะสามารถที่จะแสดงความคิดเห็นในคำถามของผู้อื่นและคำตอบ
Chris
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.