在首次显示的自定义滑动选项卡视图中设置文本颜色
Setting text color in custom sliding tab view on first display
我正在尝试根据选项卡状态在自定义视图中设置滑动选项卡上的文本颜色。它正在工作,但不在初始显示上。
The textcolor in the custom view should be white when the tab is selected and 深灰色 否则。我已经部分工作了:当我手动 select 一个选项卡时,文本颜色会正确更改。
我的问题是,在首次显示 第一个选项卡 的文本时,其内容是在用户与选项卡进行任何交互之前显示的, 不是以活动状态 color(白色)着色。它是灰色的,就像非活动选项卡一样。如果我开始与选项卡交互,一切正常,但第一个显示的选项卡的初始选项卡颜色是错误的。
[FIRST TAB | SECOND TAB]
^
Grey (inactive color) on first load
编辑:
原因似乎在 styles.xml 中:如果我声明一个继承自 Widget.Design.TabLayout 的自定义样式,初始着色将不再起作用。如果我不为 tablayout 声明自定义样式,一切正常!
编辑2:
不,它不起作用。它可以在不设置自定义视图的情况下工作,但是当第一次加载带有设置自定义视图的选项卡时,它仍然不能正确地进行初始着色。
这是我的代码:
tab_gallerylayout.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"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.mbprojects.retro.view.RetroTextView
android:id="@+id/tab_title"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:textColor="@drawable/gallerytab_title_color"
app:font="@string/font_name_syncopate"
/>
</LinearLayout>
gallerytab_title_color.xml(select或)
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_selected="true" android:color="@android:color/white" />
<item android:state_selected="false" android:color="@android:color/darker_gray" />
<item android:state_focused="true" android:color="@android:color/white" />
<item android:state_pressed="true" android:color="@android:color/white" />
<item android:color="@android:color/darker_grey" />
</selector>
styles.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="AppTheme" parent="@style/Theme.AppCompat.NoActionBar">
</style>
<style name="AppTheme.Base.Widget.Design.TabLayout" parent="Widget.Design.TabLayout">
<item name="tabMaxWidth">@dimen/tab_max_width</item>
<item name="tabIndicatorColor">@android:color/white</item>
<item name="tabIndicatorHeight">0dp</item>
<item name="tabPaddingStart">12dp</item>
<item name="tabPaddingEnd">12dp</item>
<item name="tabBackground">@android:color/black</item>
<item name="tabTextAppearance">@style/TextAppearance.Design.Tab</item>
</style>
有什么建议吗?
您应该在 xml 中使用 android:selector
而不是 android:textColor
。前者用于动态更改属性,而后者用于分配一个值并保持它
这种异常行为的原因是您的 viewPager
在 viewPager.setAdapter()
中将第一项设置为内部当前项。这反过来使 tabLayout 成为 select tabLayout.setupWithViewPager()
中的第一个选项卡。
此后当您设置自定义选项卡时,自定义视图的状态不会更改为 "selected"(因为 select 初始选项卡代码在此之前已经完成)。
因此,您需要明确更改 selected 选项卡的自定义视图的状态。
设置自定义选项卡后添加下面一行就可以了。
mTabLayout.getTabAt(mInitialTab).getCustomView().setSelected(true);
我正在尝试根据选项卡状态在自定义视图中设置滑动选项卡上的文本颜色。它正在工作,但不在初始显示上。
The textcolor in the custom view should be white when the tab is selected and 深灰色 否则。我已经部分工作了:当我手动 select 一个选项卡时,文本颜色会正确更改。
我的问题是,在首次显示 第一个选项卡 的文本时,其内容是在用户与选项卡进行任何交互之前显示的, 不是以活动状态 color(白色)着色。它是灰色的,就像非活动选项卡一样。如果我开始与选项卡交互,一切正常,但第一个显示的选项卡的初始选项卡颜色是错误的。
[FIRST TAB | SECOND TAB]
^
Grey (inactive color) on first load
编辑: 原因似乎在 styles.xml 中:如果我声明一个继承自 Widget.Design.TabLayout 的自定义样式,初始着色将不再起作用。如果我不为 tablayout 声明自定义样式,一切正常!
编辑2: 不,它不起作用。它可以在不设置自定义视图的情况下工作,但是当第一次加载带有设置自定义视图的选项卡时,它仍然不能正确地进行初始着色。
这是我的代码:
tab_gallerylayout.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"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.mbprojects.retro.view.RetroTextView
android:id="@+id/tab_title"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:textColor="@drawable/gallerytab_title_color"
app:font="@string/font_name_syncopate"
/>
</LinearLayout>
gallerytab_title_color.xml(select或)
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_selected="true" android:color="@android:color/white" />
<item android:state_selected="false" android:color="@android:color/darker_gray" />
<item android:state_focused="true" android:color="@android:color/white" />
<item android:state_pressed="true" android:color="@android:color/white" />
<item android:color="@android:color/darker_grey" />
</selector>
styles.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="AppTheme" parent="@style/Theme.AppCompat.NoActionBar">
</style>
<style name="AppTheme.Base.Widget.Design.TabLayout" parent="Widget.Design.TabLayout">
<item name="tabMaxWidth">@dimen/tab_max_width</item>
<item name="tabIndicatorColor">@android:color/white</item>
<item name="tabIndicatorHeight">0dp</item>
<item name="tabPaddingStart">12dp</item>
<item name="tabPaddingEnd">12dp</item>
<item name="tabBackground">@android:color/black</item>
<item name="tabTextAppearance">@style/TextAppearance.Design.Tab</item>
</style>
有什么建议吗?
您应该在 xml 中使用 android:selector
而不是 android:textColor
。前者用于动态更改属性,而后者用于分配一个值并保持它
这种异常行为的原因是您的 viewPager
在 viewPager.setAdapter()
中将第一项设置为内部当前项。这反过来使 tabLayout 成为 select tabLayout.setupWithViewPager()
中的第一个选项卡。
此后当您设置自定义选项卡时,自定义视图的状态不会更改为 "selected"(因为 select 初始选项卡代码在此之前已经完成)。
因此,您需要明确更改 selected 选项卡的自定义视图的状态。 设置自定义选项卡后添加下面一行就可以了。
mTabLayout.getTabAt(mInitialTab).getCustomView().setSelected(true);