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 属性的主要内容,如果未能解决你的问题,请参考以下文章