TabLayoutMediator 不保留 TabItem 属性

Posted

技术标签:

【中文标题】TabLayoutMediator 不保留 TabItem 属性【英文标题】:TabLayoutMediator not preserving TabItem attributes 【发布时间】:2020-03-22 01:28:52 【问题描述】:

我有一个使用 ViewPager2 和 TabLayout 和预设 TabItems 的简单设置:

...

        <com.google.android.material.tabs.TabLayout
            android:id="@+id/tabs"
            android:layout_
            android:layout_
            app:tabTextColor="@color/c0696D7"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toEndOf="@+id/palettesToggle"
            app:layout_constraintTop_toTopOf="parent"
            app:tabBackground="@color/cEEEEEE"
            app:tabIndicatorColor="@color/cFFFFFF"
            app:tabGravity="fill"
            app:tabUnboundedRipple="true"
            app:tabIconTint="@color/palettes_icon_tint"
            app:tabIndicatorGravity="stretch"
            app:tabMode="fixed">

            <com.google.android.material.tabs.TabItem android:icon="@drawable/palettes_layers" />

            <com.google.android.material.tabs.TabItem android:icon="@drawable/palettes_view" />

            <com.google.android.material.tabs.TabItem android:icon="@drawable/palettes_properties" />

            <com.google.android.material.tabs.TabItem android:icon="@drawable/palettes_blocks" />

            <com.google.android.material.tabs.TabItem android:icon="@drawable/palettes_blocks" />

            <com.google.android.material.tabs.TabItem android:icon="@drawable/palettes_settings" />

        </com.google.android.material.tabs.TabLayout>

        <androidx.viewpager2.widget.ViewPager2
            android:id="@+id/viewPager"
            android:layout_
            android:layout_
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/tabs" />

...

以及如下接线代码:

TabLayoutMediator(tabs, viewPager)  tab, position ->

        .attach()

以下设置忽略了TabItem 图标属性,我看到了空选项卡。 TabLayoutMediator 似乎完全覆盖了定义的 xml 属性,我必须将这些属性重置为 TabConfigurationStrategy 回调的一部分。 我错过了什么吗?

【问题讨论】:

看看这个问题谢谢:) ***.com/questions/66474349/… 【参考方案1】:

方法TabLayoutMediator.attach()calls the methodtabLayout.removeAllTabs();删除所有标签,然后再次添加标签。

还要检查official doc:

创建此类的实例时,您必须提供TabLayoutMediator.TabConfigurationStrategy 的实现,您可以在其中设置选项卡的文本,和/或执行您需要的任何选项卡样式。

类似:

new TabLayoutMediator(tabs, viewpager, new TabLayoutMediator.TabConfigurationStrategy() 
      @Override public void onConfigureTab(@NonNull TabLayout.Tab tab, int position) 
        //Configure your tabs...
        tab.setText(...);
        tab.setIcon(...);
      
    ).attach();

或:

 TabLayoutMediator(tabs, viewpager,
    TabLayoutMediator.TabConfigurationStrategy  tab, position ->
        //Configure tabs..
        when (position) 
            0 ->  tab.text = "..."
            1 ->  tab.text = "..."
        
    ).attach()

【讨论】:

感谢您的详细解释,我实际上是在问是否有办法保留默认的 xml 样式?正如我所料...... @EvgeniRoitburg 我不这么认为。 tabLayout.setupWithViewPager()(旧的 viewpager)也删除了从适配器读取数据的所有选项卡。 所以任何应用于 XML 选项卡的配置都必须再次以编程方式指定?这违反了 DRY。 这种方法强制编码标记而不是使用xml,奇怪的实现 在同一个 TabLayoutMediator 上调用第二个附加将抛出 -> IllegalStateException("TabLayoutMediator 已附加");对于任何想知道为什么需要先调用 detach 的人。

以上是关于TabLayoutMediator 不保留 TabItem 属性的主要内容,如果未能解决你的问题,请参考以下文章

Flutter Tab 切换时保留tab的状态

如何在 Swift 中呈现 UI 视图并保留 Tab 栏

keyListener用的健值表,保留一份

win10的alt+tab切屏窗口怎么能隐藏或者关闭,功能保留?

OFFICE技术讲座:制表键(TAB)对段落布局的影响

OFFICE技术讲座:制表键(TAB)对段落布局的影响