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

6
我正在使用带有动作栏的下拉导航,但是在使用深色动作栏时,我无法得到相应文本的明智颜色。动作栏本身是暗灰色的,文本颜色是黑色的,因此很难阅读。我遵循了动作栏开发者指南上的基本说明,所以我的代码只是:
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);

我的styles.xml文件非常简单

<resources>
    <style name="AppTheme" parent="android:Theme.Holo.Light.DarkActionBar">
    </style>
</resources>

我认为这应该给我一些有意义的东西,但正如下面的图片所示,它变成了黑色文本在深灰色背景上,所以没用。

黑色文本在深灰色背景上的菜单图片

我尝试过调整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>

尝试将导航下拉菜单中的项目读取变得更可读的最佳方法

我的要求是(1)将应用程序标题的文本颜色更改为橙色,(2)将操作栏中所选导航项的背景颜色更改为浅蓝色,(3)更改下拉列表的背景颜色,使黑色文本至少显示在浅色背景上。 但无论我怎么做,都不能更改文本本身的颜色,无论是操作栏中显示的所选项目还是下拉列表中显示的项目。 我的最佳尝试看起来也很糟糕:-(!

我想要的只是一个深色操作栏,并对操作栏中显示的所选项目使用合理的文本颜色,这应该是选择项目时使用的相同文本颜色,并且当选择项目时的下拉菜单的背景颜色与操作栏相同。 但是我无法弄清楚如何做到这一点,有人可以帮忙吗?

顺便说一句,我正在使用最近下载的adt-bundle-windows-x86_64-20130219带有Eclipse的工具包。 当我搜索解决方案时,我发现很多关于Sherlock操作栏的内容,但是Sherlock的样式没有包含在该adt-bundle中。 无论如何,我使用的Holo.Light.DarkActionBar应该能够实现我想要的吧?


请参考以下链接:https://dev59.com/D3A75IYBdhLWcg3wAUJ9?rq=1 - karan
6个回答

28
请原谅我的“尸体复活”(necromancy),但这个问题今天真的让我很困扰,而解决方案实际上非常快捷,无需自定义适配器或样式。
如果你在SpinnerAdapter的构造函数中将上下文(context)更改为使用getActionBar().getThemedContext()而不是this,它将显示浅色文本和深色背景,与操作栏(Action Bar)的风格相匹配。
SpinnerAdapter mSpinnerAdapter = ArrayAdapter.createFromResource(getActionBar().getThemedContext(), R.array.action_list, android.R.layout.simple_spinner_dropdown_item);

谢谢您的建议 :-). 我需要这个答案的项目现在已经停滞不前了,但如果该项目重新启动,我会考虑您的建议。 - Stochastically
这是一个很棒的发现!在我抓耳挠腮了几个小时之后,这救了我! - mido
你无法想象我在这个问题上浪费了多少时间。最终找到了一个优雅的解决方案,谢谢!PS:在我的情况下,我必须使用getSupportActionBar()而不是getActionBar()。 - CesarPim
请注意,知识获取(无论在哪里)都不存在召唤亡灵的行为。请忘记这个术语。直到大众接触互联网并带来我们通常的思维模式之前,也没有“necro”这样的术语存在。编辑:互联网是自由的 - 你想做什么就做什么 - 如果某些东西看起来很奇怪,那么提供服务的工具应该被修复。例如取消订阅、自动关闭旧帖子等。 - aeracode
说得好。我最初使用这个术语是因为当我回答这个问题时,SO授予了我“死灵法师”徽章。 - Barry
显示剩余2条评论

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;
    }
}

然后使用简单的styles.xml。
<resources>
    <style name="AppTheme" parent="android:Theme.Holo.Light.DarkActionBar">
    </style>
</resources>

我可以替换类myArrayAdaptor。
SpinnerAdapter mSpinnerAdapter = ArrayAdapter.createFromResource(this, R.array.action_list, android.R.layout.simple_spinner_dropdown_item)

文本颜色将始终为白色。但是,在styles.xml文件中使用设置是否有更简单的方法来实现这一点呢?


4
您可以使用ContextThemeWrapperSpinnerAdapter mSpinnerAdapter = ArrayAdapter.createFromResource(new ContextThemeWrapper(this, android.R.style.Theme_Holo), R.array...., android.R.layout....);。 该函数创建一个基于指定主题的ContextThemeWrapper对象,并在其上创建一个ArrayAdapter对象,用于填充Spinner或其他视图组件。通过使用这种方法,您可以使填充的UI元素与当前应用程序或操作系统的主题保持一致。 - Sa Dec
6
对于 _API 14+_,可使用ActionBar.getThemedContext()。我在这里找到了答案here - Sa Dec
@SaDec,谢谢,如果我需要重新访问我的应用程序的这一部分,我会考虑你的建议:-)。 - Stochastically
@SaDec 读了你的评论后,我发现 'ActionBar.getThemedContext()' 真的很有用!你应该为未来的读者写一个答案。 - HpTerm
天哪,我花了一整天的时间在同一个问题上寻找工作解决方案,这里隐藏着答案 - ActionBar.getThemedContext()。非常感谢Sa Dec。 - Menion Asamm
我在使用ActionBar.getThemedContext()时遇到了问题。当未选择项目时显示的文本很好,但如果我点击下拉菜单,现在给出的列表颜色很差...浅灰色与白色文本。有什么办法可以解决这个问题吗? - Mahnster

4

Java 代码

SpinnerAdapter adapter = ArrayAdapter.createFromResource(this,
        R.array.actions,R.layout.dropdown_textcolor);

// OnNavigationListener
OnNavigationListener callback = new OnNavigationListener() {

    String[] items = getResources().getStringArray(R.array.actions); 
    public boolean onNavigationItemSelected(int position, long id) {

        // Do stuff when navigation item is selected
        Log.d("NavigationItemSelected", items[position]); // Debug
        return true;
    }

};


ActionBar actions = getSupportActionBar();
actions.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
actions.setDisplayShowTitleEnabled(false);

actions.setListNavigationCallbacks(adapter, callback);

Xml下拉框文本颜色

<?xml version="1.0" encoding="utf-8"?>
<CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@android:id/text1"
    style="?android:attr/spinnerDropDownItemStyle"
    android:singleLine="true"
    android:layout_width="match_parent"
    android:textColor="@android:color/white"
    android:layout_height="wrap_content"
    android:padding="10dp"
    android:ellipsize="marquee"
    android:textAlignment="inherit"/>

1

<resources>
  <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
        <!-- Customize your theme here. -->
        <item name="android:textColor">#ffffff</item>

        <item name="android:itemBackground">#991005</item>

        <item name="android:actionBarSize">40dp</item>

        <item name="android:divider">#ff0000</item>
        <item name="android:dividerHeight">1dp</item>

        <item name="android:textSize">14sp</item>



    </style>
</resources>


1

将以下内容添加到styles.xml中,即可更改隐藏操作菜单文本的颜色:

<style name="AppTheme.AppCompat.Light" parent="@android:style/Theme.Holo.Light.DarkActionBar"> 
        <item name="android:itemTextAppearance">@style/MenuTextAppearance</item>    
</style>

<style name="MenuTextAppearance">
        <item name="android:textColor">@android:color/black</item>
</style>

1
这很清晰明了。我将它放入我的 values-night/themes.xml 中,它完美地工作了。 - muad-dweeb

0
如果你正在使用AppCompat支持库,这可能会对你有所帮助。
<style name="MyActionBar3" parent="@style/Widget.AppCompat.Light.ActionBar">
    <item name="android:background">@color/ActionBarBackground</item>         
</style>

<style name="MyActionBarDropDownStyle" parent="">
    <item name="android:background">#00FF00</item>        
    <item name="android:divider">#ff0000</item>
    <item name="android:dividerHeight">1dp</item> 
    <item name="android:textColor">#FFFFFF</item>     
    <item name="android:textSize">10sp</item>
</style>

<style name="MyTextStyle" parent="@style/Widget.AppCompat.Light.Base.ListPopupWindow">
    <item name="android:popupBackground">#FF0000</item>        
</style>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接