无法使用Android操作栏下拉导航更改文本颜色

Sto*_*lly 6 android android-actionbar android-styles

我正在使用我的操作栏下拉导航,当使用黑暗操作栏时,我无法获得相应文本的合理颜色.动作栏本身是深灰色,文本颜色是黑色,因此很难阅读.

我按照Action Bar开发人员指南中的基本说明进行操作,因此我的代码很简单

SpinnerAdapter mSpinnerAdapter = ArrayAdapter.createFromResource(this, R.array.action_list, android.R.layout.simple_spinner_dropdown_item);
ActionBar.OnNavigationListener navigationListener = new OnNavigationListener() {
    @Override
    public boolean onNavigationItemSelected(int itemPosition, long itemId) {
        // TODO
        return false;
    }
};
ActionBar actionBar = getActionBar();
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);        
actionBar.setListNavigationCallbacks(mSpinnerAdapter, navigationListener);
Run Code Online (Sandbox Code Playgroud)

而我的styles.xml很简单

<resources>
    <style name="AppTheme" parent="android:Theme.Holo.Light.DarkActionBar">
    </style>
</resources>
Run Code Online (Sandbox Code Playgroud)

认为这应该给了我一些明智的东西,但如下图所示,它在深灰色的背景上显示为黑色文字,所以它没有用.

菜单的图象与黑文本的在深灰背景

我尝试过使用styles.xml文件来尝试解决问题.我最好的尝试是以下

<resources>
    <style name="AppTheme" parent="android:Theme.Holo.Light.DarkActionBar">
        <item name="android:actionDropDownStyle">@style/myActionDropDownStyle</item>
        <item name="android:actionBarStyle">@style/myActionBar</item>
    </style>

    <style name="myActionDropDownStyle" parent="android:style/Widget.Holo.Light.Spinner">
        <item name="android:background">@color/LightCyan</item>
    </style>

    <style name="myActionBar" parent="@android:style/Widget.Holo.Light.ActionBar.Solid.Inverse">    
        <item name="android:titleTextStyle">@style/myActionBar.titleTextStyle</item>
    </style>

    <style name="myActionBar.titleTextStyle" parent="@android:style/TextAppearance.Holo.Widget.ActionBar.Title.Inverse">
        <item name="android:textColor">@color/Orange</item>
    </style>
</resources>
Run Code Online (Sandbox Code Playgroud)

最好的尝试是在导航下拉列表中使项目可读

这是(1)能够将应用程序标题的文本颜色更改为橙​​色,(2)能够将操作栏中所选导航项的背景颜色更改为浅蓝色,(3)能够更改背景颜色下拉列表使得至少黑色文本显示在浅色背景上.但是,我所做的任何事情都不会更改文本颜色本身,无论是对于操作栏中显示的选定项目,还是对于下拉列表中显示的项目.我最好的尝试也看起来很可怕:-(!

我想要的只是一个黑暗的动作栏,其动作栏中显示的所选项目具有合理的文本颜色,应该与选择项目时使用的文本颜色相同,并且当项目为时,下拉列表的背景颜色为选择与操作栏相同的颜色.但我无法弄明白该怎么做,有人可以帮忙吗?

仅供参考,我正在使用Eclipse和我最近下载的adt-bundle(adt-bundle-windows-x86_64-20130219).当我搜索解决方案时,我发现很多关于Sherlock操作栏的内容,但Sherlock的样式并未包含在该adt-bundle中.在任何情况下,我使用的Holo.Light.DarkActionBar当然可以实现我想要的东西吗?

小智 28

请原谅我的死灵法,但今天这真的让我感到困扰,解决方案实际上非常快,不需要自定义适配器或样式.

如果你在SpinnerAdapter的构造函数中更改上下文以使用getActionBar().getThemedContext()而不是它,它将在深色背景上显示与Action Bar样式相匹配的浅色文本.

SpinnerAdapter mSpinnerAdapter = ArrayAdapter.createFromResource(getActionBar().getThemedContext(), R.array.action_list, android.R.layout.simple_spinner_dropdown_item);
Run Code Online (Sandbox Code Playgroud)


Sto*_*lly 9

我已经知道我可以通过创建我自己的ArrayAdapter子类来改变代码中下拉导航的颜色,如下所示:

public class myArrayAdaptor<T> extends ArrayAdapter<T> {

    public myArrayAdaptor(Context context, int textViewResourceId, T[] objects) {
        super(context, textViewResourceId, objects);
    }

    public static myArrayAdaptor<CharSequence> createFromResource(Context context, int textArrayResId, int textViewResId) {
        CharSequence[] strings = context.getResources().getTextArray(textArrayResId);
        return new myArrayAdaptor<CharSequence>(context, textViewResId, strings);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        return SetColourWhite(super.getView(position, convertView, parent));
    }

    @Override
    public View getDropDownView(int position, View convertView, ViewGroup parent) {
        return SetColourWhite(super.getView(position, convertView, parent));
    }

    private View SetColourWhite(View v) {
        if (v instanceof TextView) ((TextView)v).setTextColor(Color.rgb(0xff, 0xff, 0xff)); // white
        return v;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后使用简单的styles.xml

<resources>
    <style name="AppTheme" parent="android:Theme.Holo.Light.DarkActionBar">
    </style>
</resources>
Run Code Online (Sandbox Code Playgroud)

我可以替换myArrayAdaptor类

SpinnerAdapter mSpinnerAdapter = ArrayAdapter.createFromResource(this, R.array.action_list, android.R.layout.simple_spinner_dropdown_item)
Run Code Online (Sandbox Code Playgroud)

并且文本颜色将始终为白色.但是,使用styles.xml文件中的设置是不是有更简单的方法呢?

  • 或者_API 14 + _的[`ActionBar.getThemedContext()`](http://developer.android.com/reference/android/app/ActionBar.html#getThemedContext()).我找到了答案[此处](https://code.google.com/p/android/issues/detail?id=25624#c1). (6认同)
  • 你可以使用[`ContextThemeWrapper`](http://developer.android.com/reference/android/view/ContextThemeWrapper.html):`SpinnerAdapter mSpinnerAdapter = ArrayAdapter.createFromResource(new ContextThemeWrapper(this,android.R.style.Theme_Holo) ),R.array ....,android.R.layout ....);` (4认同)