我使用TabLayout与viewPager和viewPager使用RecyclerView为它的片段扩展FragmentStatePageAdapter。
这一切都很好。但是,我有一个场景,我想在可滚动模式下(当tabMode设置为可滚动时)将tabLayout的项目数量设置为仅(7)。
不知何故,当tabLayout设置为可滚动时,它只设置每个设备5个项目,但在我的场景中,我希望它调整7个项目,而不管任何设备。
我试图给项目宽度为总DeviceWidht/7,但没有运气,因为它仍然采取相同的widht。
我还尝试通过编写自定义tabLayout来覆盖onMeasure()方法。但是,运气不好。
我不确定这个问题是否是与page erTabStrip有关,或者当tabMode设置为可滚动时,viewPager和tabLayout如何计算要修复的项目数。
我被困在这个问题从过去3天。
这是我的主要xml布局…
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
tools:context="com.movie.bms.views.activities.TimeActivity"
tools:showIn="@layout/activity_time"
>
<android.support.design.widget.TabLayout
android:id="@+id/time_sliding_tab"
android:layout_width="match_parent"
android:layout_height="61.8dp"
android:background="#06acef"
android:elevation="0dp"
android:theme="@style/ThemeOverlay.AppCompat.Dark"
app:elevation="@dimen/elevation.small"
app:tabGravity="center"
app:tabIndicatorColor="@color/white"
app:tabMode="scrollable"
app:tabPaddingEnd="-1dp"
app:tabPaddingStart="-1dp"
android:fillViewport="false"
></android.support.design.widget.TabLayout>
<com.utils.customcomponents.CustomViewPager
android:id="@+id/time_view_pager"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:transitionName="@string/event_body_transition">
</com.utils.customcomponents.CustomViewPager>
</LinearLayout>
任何形式的帮助或建议将不胜感激。
您可以通过在xml中的TabLayout上设置app: tabMinWidth
和app:tabMaxWidth
元素来影响选项卡的实际宽度。
例如,对于Nexus 5(360dp):
<android.support.design.widget.TabLayout
android:id="@+id/time_sliding_tab"
android:layout_width="match_parent"
android:layout_height="62dp"
android:background="#06acef"
app:tabGravity="center"
app:tabMaxWidth="50dp"
app:tabMinWidth="50dp"
app:tabMode="scrollable" />
但是说实话,你需要估计“猜测”你的目标宽度是多少,并为此进行优化。它在实际设备上的外观将取决于它的实际宽度。
如果您想使其100%适合,您需要:
应用程序:tabMinWidth
和tabMaxWidth
值作为属性集。(您根据屏幕宽度计算)mRequest estedTabMinWidth
和mRequest estedTabMaxWidth
私有字段。(不推荐)反射情况如何工作的示例:
import android.content.Context;
import android.support.design.widget.TabLayout;
import android.util.AttributeSet;
import java.lang.reflect.Field;
public class SevenTabLayout extends TabLayout {
public class SetTabWidthException extends RuntimeException {
}
public SevenTabLayout(Context context) {
super(context);
}
public SevenTabLayout(Context context, AttributeSet attrs) {
super(context, attrs);
initializeTabWidths();
}
public SevenTabLayout(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
initializeTabWidths();
}
public void initializeTabWidths() {
int tabwidth = 140; // Screensize divided by 7
setPrivateField("mRequestedTabMinWidth", tabwidth);
setPrivateField("mRequestedTabMaxWidth", tabwidth);
}
private void setPrivateField(String tabMinWidthFieldName, int value) {
try {
Field f = TabLayout.class.getDeclaredField(tabMinWidthFieldName);
f.setAccessible(true);
f.setInt(this, value);
} catch (NoSuchFieldException e) {
throw new SetTabWidthException();
} catch (IllegalAccessException e2) {
throw new SetTabWidthException();
}
}
}
现在,您可以轻松地为初始化TabWidths()
方法添加一个单元测试,这样您就可以在升级设计支持库后检测它何时停止工作。