如何使用一行布局更改 ActionBar Tab 文本颜色?

how to change the ActionBar Tab text color with one line layout?

有两行布局,看ActionBar选项卡,文字颜色为蓝色;

而且这是单行布局,texColor是白色的,你怎么做出来的?

1 要改变Tab Style,不能使用actionBar.newTab().setText(xxx),因为你不能获取TextView,所以你必须创建一个TextView,然后使用actionBar.newTab().setCustomView(tabView);

private TextView createTab(int titleText) {
    TextView textView = new TextView(this,null,R.attr.actionBarTabTextStyle);
    textView.setGravity(Gravity.CENTER_VERTICAL);
    textView.setEllipsize(TextUtils.TruncateAt.END);
    LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,
            LinearLayout.LayoutParams.MATCH_PARENT);
    textView.setLayoutParams(lp);
    textView.setText(titleText);
    return textView;
}

2 看R.attr.actionBarTabTextStyle属性,必须在attrs.xml

中写一行
//attrs.xml
<attr name="actionBarTabTextStyle" format="reference"/>

样式参考,在styles/xml或theme.xml

<style name="MyTheme" parent="android:style/Theme.Holo.Light.DarkActionBar">
    <item name="android:actionBarTabTextStyle">@style/ActionBarTabTextStyle</item>
    <item name="actionBarTabTextStyle">@style/ActionBarTabTextStyle</item>
</style>

3 创建一个 Tab 并将其添加到 ActionBar:

// MainActivity
TextView tabView=createTab(tabTitle);
ActionBar.Tab actionBarTab=actionBar.newTab();
actionBarTab.setCustomView(tabView).setTabListener(this)
actionBar.addTab(actionBarTab);

4 ActionBar 有一个私有的field:mHasEmbeddedTabs,当一行为真,其他为假,所以只取这个字段的值。

private boolean mHasEmbeddedTabs =true;
@Override
public void onCreate(Bundle savedInstanceState) {
    try {
        Field field = actionBar.getClass().getDeclaredField("mHasEmbeddedTabs");
        field.setAccessible(true);
        this.mHasEmbeddedTabs=field.getBoolean(actionBar);
    } catch (NoSuchFieldException e) {
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    }
}

5 现在我可以在操作栏和选项卡在一行时更改选项卡文本颜色

if(this.mHasEmbeddedTabs){
   tabView.setTextColor(getResources().getColor(R.color.white));
}