Android 如何在TabLayout中设置固定计数?

Android 如何在TabLayout中设置固定计数?,android,android-viewpager,android-tablayout,Android,Android Viewpager,Android Tablayout,我将TabLayout与viewPager一起使用,viewPager使用RecyclerView来表示它的片段,它扩展了FragmentStatePageAdapter 这一切都很好。 但是,我有一个场景,我想在可滚动模式下(当tabMode设置为可滚动时)将tabLayout的项目数设置为仅(7) 不知何故,当tabLayout设置为scrollable时,它只为每个设备设置5个项目,但在我的场景中,我希望它调整7个项目,而不考虑任何设备 我尝试将项目宽度设置为totalDeviceWidt

我将TabLayout与viewPager一起使用,viewPager使用RecyclerView来表示它的片段,它扩展了FragmentStatePageAdapter

这一切都很好。 但是,我有一个场景,我想在可滚动模式下(当tabMode设置为可滚动时)将tabLayout的项目数设置为仅(7)

不知何故,当tabLayout设置为scrollable时,它只为每个设备设置5个项目,但在我的场景中,我希望它调整7个项目,而不考虑任何设备

我尝试将项目宽度设置为totalDeviceWidt/7,但没有成功,因为它仍然使用相同的宽度

我还尝试通过编写自定义tabLayout来重写onMeasure()方法。但是,没有运气

我不确定问题是否出在pagerTabStrip上,或者当tabMode设置为可滚动时,viewPager和TableLayout如何计算要修复的项目数

我在过去三天一直在处理这个问题

这是我的主要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表格布局上设置
app:tabMinWidth
app:tabMaxWidth
元素来影响选项卡的实际宽度

例如,对于Nexus 5(360dp):

。(根据屏幕宽度计算)
  • 在现有TabLayout实例上使用以设置
    mRequestedTabMinWidth
    mRequestedTabMaxWidth
    专用字段。(不推荐)
  • 反射案例如何工作的示例:

    导入android.content.Context;
    导入android.support.design.widget.TabLayout;
    导入android.util.AttributeSet;
    导入java.lang.reflect.Field;
    公共类SevenTabLayout扩展表布局{
    公共类SetTabWidthException扩展RuntimeException{
    }
    public SevenTabLayout(上下文){
    超级(上下文);
    }
    public SeventBlayout(上下文、属性集属性){
    超级(上下文,attrs);
    初始化etabwidths();
    }
    public SevenTabLayout(上下文上下文、属性集属性、int defStyleAttr){
    super(上下文、attrs、defStyleAttr);
    初始化etabwidths();
    }
    公共无效初始值etabwidths(){
    int tabwidth=140;//屏幕大小除以7
    setPrivateField(“mRequestedTabMinWidth”,tabwidth);
    setPrivateField(“mRequestedTabMaxWidth”,tabwidth);
    }
    私有void setPrivateField(字符串tabMinWidthFieldName,int值){
    试一试{
    字段f=TabLayout.class.getDeclaredField(tabMinWidthFieldName);
    f、 setAccessible(true);
    f、 setInt(这个值);
    }捕获(无此字段例外){
    抛出新的SetTabWidthException();
    }捕获(非法访问异常e2){
    抛出新的SetTabWidthException();
    }
    }
    }
    

    现在,您可以轻松地为
    InitializeTabWidth()
    方法添加一个单元测试,以便在升级设计支持库后检测它何时停止工作。

    您可以通过在xml格式的TabLayout上设置
    app:tabMinWidth
    app:tabMaxWidth
    元素来影响选项卡的实际宽度

    例如,对于Nexus 5(360dp):

    。(根据屏幕宽度计算)
    
  • 在现有TabLayout实例上使用以设置
    mRequestedTabMinWidth
    mRequestedTabMaxWidth
    专用字段。(不推荐)
  • 反射案例如何工作的示例:

    导入android.content.Context;
    导入android.support.design.widget.TabLayout;
    导入android.util.AttributeSet;
    导入java.lang.reflect.Field;
    公共类SevenTabLayout扩展表布局{
    公共类SetTabWidthException扩展RuntimeException{
    }
    public SevenTabLayout(上下文){
    超级(上下文);
    }
    public SeventBlayout(上下文、属性集属性){
    超级(上下文,attrs);
    初始化etabwidths();
    }
    public SevenTabLayout(上下文上下文、属性集属性、int defStyleAttr){
    super(上下文、attrs、defStyleAttr);
    初始化etabwidths();
    }
    公共无效初始值etabwidths(){
    int tabwidth=140;//屏幕大小除以7
    setPrivateField(“mRequestedTabMinWidth”,tabwidth);
    setPrivateField(“mRequestedTabMaxWidth”,tabwidth);
    }
    私有void setPrivateField(字符串tabMinWidthFieldName,int值){
    试一试{
    字段f=TabLayout.class.getDeclaredField(tabMinWidthFieldName);
    f、 setAccessible(true);
    f、 setInt(这个值);
    }捕获(无此字段例外){
    抛出新的SetTabWidthException();
    }捕获(非法访问异常e2){
    抛出新的SetTabWidthException();
    }
    }
    }
    

    现在,您可以轻松地为
    initializeTabWidths()添加单元测试
    方法,以便您可以在升级设计支持库后检测何时停止工作。

    如果将表格布局封装在水平可滚动布局中,并在代码中检查是否有七个,并且仅从七个开始激活可滚动布局,该方法可能不起作用,在七个项目之后,我可能还有20个项目。我真正想要的是,我希望scrollView选项卡模式适合7个项目,根据现在的情况,它将项目作为设备宽度file@NJNileshJ更新,请看一看。如果您将表格布局封装在一个水平可滚动布局中,并在代码中检查您是否有七个,并且仅从七个开始激活可滚动布局,该怎么办?这种方法可能不起作用,因为在七个项目之后,我可能还有20个项目。我真正想要的是,我希望scrollView选项卡模式适合7个项目,根据现在的情况,它将项目作为设备宽度file@NJNileshJ更新了,请看一看。哦,伙计。。。非常感谢。。。成功了