【问题标题】:what is the best way to set the tab layout tabmode for tablets?为平板电脑设置选项卡布局选项卡模式的最佳方法是什么?
【发布时间】:2015-09-27 01:17:29
【问题描述】:

我正在使用来自 Android 设计支持库的 TabLayout。如何将 MODE_SCROLLABLE 与 GRAVITY_FILL 一起使用,使其在所有设备和方向上看起来都一样?

目前,如果我使用 MODE_SCROLLABLE,它在 7 英寸平板电脑上看起来不错,但在 10 英寸平板电脑上,选项卡向左对齐。我希望能够对所有尺寸使用 GRAVITY_FILL。

这是我的表格布局:

<android.support.design.widget.TabLayout
    android:id="@+id/tab_layout"
    android:layout_width="match_parent"
    android:layout_height="72dp"            
/>

我正在代码中设置模式

 tabLayout.setTabMode(TabLayout.MODE_SCROLLABLE);

【问题讨论】:

    标签: android android-design-library android-tablayout


    【解决方案1】:

    我使用了与 Jayesh 非常相似的解决方案,但我的解决方案使用了选项卡的最小宽度,并基于此计算要使用的模式。这样,您只需要知道标签可接受的最小尺寸是多少。如果它们都适合有多余的空间,它会将它们拉伸以填满所有空间,如果太多,它将使它们成为最小宽度并切换到可滚动。

     DisplayMetrics displayMetrics = getResources().getDisplayMetrics();
            float dpWidth = displayMetrics.widthPixels / displayMetrics.density;
            //For some reason, setting minWidth in xml and then accessing it here doesn't work, returns 0
            int minWidth = 80;
            tabLayout.setMinimumWidth(minWidth);
    
            //If there are less tabs than needed to necessitate scrolling, set to fixed/fill
            if(tabLayout.getTabCount() < dpWidth/minWidth){
                tabLayout.setTabMode(TabLayout.MODE_FIXED);
                tabLayout.setTabGravity(TabLayout.GRAVITY_FILL);
            }else{
                //Otherwise, set to scrollable
                tabLayout.setTabMode(TabLayout.MODE_SCROLLABLE);
    
            }
    

    在xml中,Tablayout只有这些属性

    <android.support.design.widget.TabLayout
        android:id="@+id/sliding_tabs"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:tabMaxWidth="0dp"
        />
    

    【讨论】:

    • 感谢@Matt 这对我有帮助。
    【解决方案2】:
    //to get phones width in dp
    int w= (int)((Resources.getSystem().getDisplayMetrics().widthPixels)/Resources.getSystem().getDisplayMetrics().density);
    //To check screen width is greater than approx total no of tabswidth 
    //I have calculated tabswidth by setting mode scrollable in layout and trying in defferent phones i got space left in 384dp width phone and no space in 360dp width phone so i took 370
            if(w>370){
                tabLayout.setTabGravity(TabLayout.GRAVITY_FILL);
                tabLayout.setTabMode(TabLayout.MODE_FIXED);
            }
        else
            tabLayout.setTabMode(TabLayout.MODE_SCROLLABLE);
    

    【讨论】:

      【解决方案3】:

      我遇到了同样的问题。

      在我看来,没有简单的方法可以解决这个问题。 在 FIX_MODE 中,tablayout 中的所有选项卡基于最大项具有相同的宽度。

      而在 SCROLL_MODE 中,所有选项卡都有自己的宽度。

      所以解决方案变得有点复杂。

      我想了两个解决方案,第一个解决方案:为每个选项卡项的文本留出一些空白空间,以使所有项具有相同的宽度并同时填满屏幕。

      另一种解决方案是在tablayout中使用customview,正如article中所说,然后您可以手动设置项目宽度。

      【讨论】:

        【解决方案4】:

        根据TabLayout.GRAVITY_FILL documentation

        重力用来尽可能地填充TabLayout。此选项仅在与MODE_FIXED 一起使用时生效。

        因此,通过将模式设置为 MODE_SCROLLABLE,标签始终从起始边缘对齐 - 平板电脑和手机之间 MODE_SCROLLABLE 的唯一区别是标签的最小宽度,由 tabs material design spec 设置。

        请注意,如果要将视图设置为始终可滚动,则可以通过 XML 指定重力和选项卡模式:

        <android.support.design.widget.TabLayout
          android:id="@+id/tab_layout"
          android:layout_width="match_parent"
          android:layout_height="72dp"
          app:tabMode="scrollable"
        />
        

        【讨论】:

        • 如果没有足够的宽度,我希望视图可以滚动。但如果宽度可用,我希望他们使用 GRAVITY_FILL。有什么办法可以做到这一点?基本上,我想确保 tablayout 在两个方向上始终在手机、7" 平板电脑和 10" 平板电脑上使用gravity_fill。但是,如果我将 GRAVITY_FILL 与 MODE_FIXED 一起使用,我的选项卡中的文本会被截断。
        • 根据tab usage spec,固定标签和可滚动标签有不同的用例,不一定可以互换。这就是为什么默认情况下唯一会根据屏幕尺寸变化的是重力。
        猜你喜欢
        • 2023-03-13
        • 1970-01-01
        • 2023-03-28
        • 1970-01-01
        • 1970-01-01
        • 2023-03-09
        • 1970-01-01
        • 2010-10-24
        • 1970-01-01
        相关资源
        最近更新 更多