有没有办法以编程方式设置特定的Tablayout.Tab文本颜色,而不使用状态列表?

时间:2018-01-09 21:10:39

标签: android xamarin xamarin.android

问题是如何更改单个TabLayout.Tab的文本颜色。理想情况下,我希望迭代选项卡并根据相应ViewPager片段中包含的信息更改其颜色。

2 个答案:

答案 0 :(得分:1)

(这是一个Java答案;希望尽管您使用的是Xamarin,但它仍然有用。)

据我所知,假设您正在使用通过<TabItem>标记创建的默认视图或调用setupWithViewPager(myPager),则无法使用公共API执行此操作。这些创建TabLayout.Tab实例的方法会创建一个包私有TabView mView字段(其本身具有private TextView mTextView字段)。没有办法获得对这个TextView的引用,所以没有办法做你想做的事。

...除非你愿意采取反思(这意味着这个解决方案可能随时破解)。然后你可以做这样的事情:

TabLayout tabs = findViewById(R.id.tabs);

try {
    for (int i = 0; i < tabs.getTabCount(); i++) {
        TabLayout.Tab tab = tabs.getTabAt(i);

        Field viewField = TabLayout.Tab.class.getDeclaredField("mView");
        viewField.setAccessible(true);
        Object tabView = viewField.get(tab);

        Field textViewField = tabView.getClass().getDeclaredField("mTextView");
        textViewField.setAccessible(true);
        TextView textView = (TextView) textViewField.get(tabView);

        textView.setTextColor(/* your color here */);
    }
}
catch (NoSuchFieldException e) {
    // TODO
}
catch (IllegalAccessException e) {
    // TODO
}

答案 1 :(得分:1)

最简单的方法是从指定的TextView获取TabLayout.Tab,然后使用TextView.SetTextColor(Color color)设置文字颜色,您可以执行以下操作:

TabLayout tabLayout = new TabLayout(this);
int wantedTabIndex = 0;

TextView tabTextView = (TextView)(((LinearLayout)((LinearLayout)tabLayout.GetChildAt(0)).GetChildAt(wantedTabIndex)).GetChildAt(1));

var textColor = Color.Black;
tabTextView.SetTextColor(textColor);