이 게시물에 업데이트 탭 29/05/2015 로 설정 탭 이 있습니다. 탭은 Nexus 4 휴대 전화에서 전체 너비를 차지하지만 nexus 7 태블릿에서는 전체 화면 너비를 가리지 않고 중앙에 배치합니다.
Nexus 7 스크린 샷 Nexus 4 스크린 샷
이 게시물에 업데이트 탭 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>
이 스타일 에서 "fill"값을 사용하여 " tabGravity "(가능한 값은 "center"또는 "fill")를 사용합니다.
그러나 우리는 더 깊이 가야하며 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), 3 개 이상의 탭 (동적 탭)이 필요할 때
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" />
해결책은 아래 코드를 확인하십시오.
아래는 레이아웃 코드입니다.
<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 에서 가져온 참조
스크롤 가능 솔루션 (코 틀린)
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" />
코 틀린에서 :
내 경우에는 탭이 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"
대신.