Не удается изменить цвет текста с помощью выпадающего меню панели действий Android

Я использую раскрывающуюся навигацию с моей панелью действий, и я не могу получить разумный цвет для соответствующего текста при использовании темной панели действий. Сама панель действий темно-серая, а цвет текста черный, поэтому ее очень трудно прочитать.

я следовал основным инструкциям на руководство разработчика панели действий поэтому мой код просто

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

и мои стили.XML был просто

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

Я думаю это должно было дал мне что-то разумное, но, как показывает следующее изображение, он выходит как черный текст на темно-сером фоне, так что это не хорошо.

Image of menu with black text on a dark grey background

Я пробовал играть со стилями.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>

Best attempt at making the items readable in the navigation dropdown

который был (1) в состоянии изменить цвет текста заголовка приложения на оранжевый, (2) в состоянии изменить цвет фона выбранного элемента навигации в панель действий на светло-голубой, (3) возможность изменить цвет фона выпадающего так что, по крайней мере, черный текст на светлом фоне. Однако ничто не изменяет цвет текста, либо на выбранный элемент отображается в панели действий, или для пунктов в выпадающем списке. Моя лучшая попытка также выглядит ужасно :-(!

все, что я хочу, это темная панель действий с разумным цветом текста для выбранного элемента, показанного в панели действий, который должен быть тем же текстом цвет, используемый при выборе элемента, и цвет фона для раскрывающегося списка при выборе элемента является тем же цветом, что и панель действий. Но я не могу понять, как это сделать, может кто-нибудь помочь?

FYI, я использую Eclipse с ADT-пакетом, который я загрузил совсем недавно (adt-bundle-windows-x86_64-20130219). Когда я ищу решения, я нахожу много о панели действий Шерлока, однако стили для Шерлока не были включены в этот adt-пакет. В любом кейс, конечно, то, что я хочу, должно быть возможно с голограммой.Свет.DarkActionBar, который я использую?

4 ответов


пожалуйста, простите мою некромантию, но это действительно беспокоило меня сегодня, и решение на самом деле довольно быстрое и не требует пользовательских адаптеров или стиля.

Если вы измените контекст в конструкторе SpinnerAdapter для использования getActionBar ().getThemedContext () вместо этого он покажет светлый текст на темном фоне, который будет соответствовать стилю панели действий.

SpinnerAdapter mSpinnerAdapter = ArrayAdapter.createFromResource(getActionBar().getThemedContext(), R.array.action_list, android.R.layout.simple_spinner_dropdown_item);

я понял, что могу изменить цвета для раскрывающейся навигации в коде, создав свой собственный подкласс 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;
    }
}

затем с помощью простых стилей.в 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)

и цвет текста всегда будет белым. Но нет ли более простого способа сделать это, используя настройки в стилях.xml-файл?


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-файле dropdown_textcolor.в 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"/>

Если вы используете библиотеку поддержки 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>