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

时间:2016-01-28 18:28:38

标签: android android-viewpager android-tablayout

我正在使用带有viewPager的TabLayout,而viewPager使用了RecyclerView来扩展FragmentStatePageAdapter的片段。

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

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

我尝试将项目宽度设为 totalDeviceWidht / 7 ,但没有运气,因为它仍然采取相同的措施。

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

我不确定问题是否与 pagerTabStrip 有关,或者当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>

任何形式的帮助或建议都将不胜感激。

1 个答案:

答案 0 :(得分:4)

您可以通过在xml中设置TabLayout上的app:tabMinWidthapp: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%,你需要:

  • 在代码中实例化TabLayout,并将正确的app:tabMinWidthtabMaxWidth值传递为AttributeSet。 (根据屏幕宽度计算)
  • 在现有的TabLayout实例上使用reflection来设置mRequestedTabMinWidthmRequestedTabMaxWidth个私有字段。 (不推荐)

反射案例如何运作的一个例子:

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();
        }
    }
}

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