ฉันมีแท็บการตั้งค่าเป็นUPDATE 29/05/2015 นี้โพสต์ แท็บใช้ความกว้างเต็มบนมือถือ Nexus 4 ของฉัน แต่ใช้แท็บเล็ต Nexus 7 ที่อยู่ตรงกลางและไม่ครอบคลุมความกว้างเต็มหน้าจอ
ภาพหน้าจอ Nexus 7 ภาพหน้าจอ Nexus 4
ฉันมีแท็บการตั้งค่าเป็นUPDATE 29/05/2015 นี้โพสต์ แท็บใช้ความกว้างเต็มบนมือถือ Nexus 4 ของฉัน แต่ใช้แท็บเล็ต Nexus 7 ที่อยู่ตรงกลางและไม่ครอบคลุมความกว้างเต็มหน้าจอ
ภาพหน้าจอ Nexus 7 ภาพหน้าจอ Nexus 4
คำตอบ:
คำตอบ "เรียบง่าย" ที่ยืมมาจาก Kaizieจะเพิ่มapp:tabMaxWidth="0dp"
ในTabLayout
xml ของคุณ:
<android.support.design.widget.TabLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:tabMaxWidth="0dp"
app:tabGravity="fill"
app:tabMode="fixed" />
ฉันมีปัญหาเดียวกันและฉันตรวจสอบสไตล์ 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>
จากนั้นแถบแท็บจะเต็มหน้าจอจากด้านหนึ่งไปอีกด้านหนึ่ง
โซลูชันสำหรับเลื่อนได้: (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);
}
}
addTab
และตั้งค่าน้ำหนักสำหรับแต่ละแท็บเมื่อเพิ่ม override fun addTab(tab: Tab, position: Int, setSelected: Boolean) { super.addTab(tab, position, setSelected) allotEachTabWithEqualWidth() }
หากต้องการบังคับให้แท็บรับความกว้างเต็ม (แบ่งเป็นขนาดเท่ากัน) ให้ใช้ดังต่อไปนี้กับTabLayout
มุมมอง:
TabLayout tabLayout = (TabLayout) findViewById(R.id.your_tab_layout);
tabLayout.setTabGravity(TabLayout.GRAVITY_FILL);
tabLayout.setTabMode(TabLayout.MODE_FIXED);
TabLayout
ตั้งค่าไว้app:tabMode=“scrollable”
มันจะส่งผลให้แท็บกลายเป็นความยาวคงที่ (คำยาวจะล้อมรอบ) และแท็บจะไม่เลื่อนอีกต่อไปทำให้แท็บ "คงที่" อีกครั้ง
สิ่งนี้มีประโยชน์ที่คุณต้องลอง
<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" />
<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"
สำหรับฉันรหัสต่อไปนี้ทำงานและก็เพียงพอ
<android.support.design.widget.TabLayout
android:id="@+id/tabs"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:tabGravity="fill"/>
ตรวจสอบรหัสด้านล่างเพื่อดูวิธีแก้ไข
ด้านล่างคือรหัสเลย์เอาต์:
<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
โซลูชันสำหรับเลื่อนได้ (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
}
}
tabLayout.setTabMode(TabLayout.MODE_SCROLLABLE);
อีกทั้งนี่เป็นเพียงคุณสมบัติที่ตั้งไว้สำหรับ tabLayout สิ่งนี้ไม่สำคัญว่าจะมีกี่แท็บที่คุณเพิ่มทั้งแบบคงที่หรือแบบไดนามิก
ในตัวแปรของฉันของปัญหานี้ฉันมี 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"
แทน
โปรดทราบว่าคุณต้องตั้งค่า
app:tabPaddingStart="-1dp"
app:tabPaddingEnd="-1dp"
เพื่อเติมเต็มพื้นที่ทั้งหมด