2013-04-11 15 views
6

Uso la Navigazione a discesa con la mia barra delle azioni e non riesco a ottenere un colore sensibile per il testo corrispondente quando si utilizza una barra di azione scura . La barra delle azioni è di colore grigio scuro e il colore del testo è nero, quindi è molto difficile da leggere.Impossibile modificare il colore del testo con la barra di navigazione di Android Barra di navigazione a discesa

Ho seguito le istruzioni di base sul Action Bar developer's guide quindi il mio codice è semplicemente

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

e la mia era semplicemente styles.xml

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

Io penso che dovrebbe mi hanno dato qualcosa di sensato, ma come mostra l'immagine seguente, viene fuori come testo nero su uno sfondo grigio scuro, quindi non va bene.

Image of menu with black text on a dark grey background

Ho provato a giocare con il file styles.xml per cercare di risolvere il problema. Il mio miglior tentativo è stato il seguente

<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

che era (1) in grado di cambiare il colore del testo del titolo app per Arancione, (2) in grado di cambiare il colore della voce di navigazione selezionato sfondo nella barra delle azioni su una luce blu, (3) in grado di modificare il colore di sfondo del menu a discesa in modo che almeno il testo nero venga visualizzato su uno sfondo chiaro. Tuttavia, nulla di ciò che faccio cambia il colore del testo stesso, sia per l'elemento selezionato mostrato nella barra delle azioni, sia per gli elementi mostrati nel menu a discesa. Il mio miglior tentativo sembra anche orribile :-(!

Tutto quello che voglio è una barra di azione scura con un colore di testo sensibile per l'elemento selezionato mostrato nella barra delle azioni, che dovrebbe essere lo stesso colore del testo utilizzato quando un elemento è selezionato e con il colore di sfondo per il menu a discesa quando un elemento viene selezionato dello stesso colore della barra delle azioni, ma non riesco a capire come farlo, qualcuno può aiutarti?

FYI, I'm usando Eclipse con un pacchetto adt che ho scaricato molto recentemente (adt-bundle-windows-x86_64-20130219). Quando cerco soluzioni, trovo molto sulla barra di azione di Sherlock, tuttavia gli stili di Sherlock non sono stati inclusi che adt-bundle. In ogni caso, sicuramente quello che voglio dovrebbe essere possibile con la Holo.Light.DarkActionBar che sto usando?

+0

riferisce questo ... http: //stackoverflow.com/questions/3519277/how-to -change-the-text-color-di-menu-item-in-android? rq = 1 –

risposta

9

ho lavorato fuori che posso modificare i colori per la discesa di navigazione nel codice, per creare il mio sottoclasse di ArrayAdapter come segue:

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

Poi, con la semplice styles.xml

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

posso sostituire il myArrayAdaptor classe

SpinnerAdapter mSpinnerAdapter = ArrayAdapter.createFromResource(this, R.array.action_list, android.R.layout.simple_spinner_dropdown_item) 

e il colore del testo sarà sempre w Hite. Ma non c'è un modo più semplice per farlo usando le impostazioni nel file styles.xml?

+4

Puoi usare ['ContextThemeWrapper'] (http://developer.android.com/reference/android/view/ContextThemeWrapper. html): 'SpinnerAdapter mSpinnerAdapter = ArrayAdapter.createFromResource (nuovo ContextThemeWrapper (questo, android.R.style.Theme_Holo), R.array ...., android.R.layout ....);' –

+6

Oppure ['ActionBar .getThemedContext() '] (http://developer.android.com/reference/android/app/ActionBar.html#getThemedContext()) per _API 14 + _. Ho trovato la risposta [qui] (https://code.google.com/p/android/issues/detail?id=25624#c1). –

+0

@SaDec, grazie, se dovessi rivisitare questo bit della mia app, esaminerò i tuoi suggerimenti :-). – Stochastically

28

Si prega di perdonare la mia necromanzia ma questo mi ha davvero infastidito oggi e la soluzione è in realtà abbastanza veloce e non richiede adattatori o styling personalizzati.

Se si modifica il contesto nel costruttore di SpinnerAdapter per utilizzare getActionBar(). GetThemedContext() piuttosto che questo mostrerà testo chiaro su uno sfondo scuro che corrisponderà allo stile della barra di azione.

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

Grazie, per il suggerimento :-). Il progetto per il quale avevo bisogno di questa risposta è ora inattivo, ma esaminerò il tuo suggerimento se il progetto verrà mai ripreso. – Stochastically

+0

Ottima soluzione. Questa dovrebbe essere la risposta accettata. –

+0

Ha funzionato! Grazie mille. Stavo lottando con i temi creati da Theme-Generator (http://jgilfelt.github.io/android-actionbarstylegenerator/) per scoprire come cambiare il colore del testo dal nero al bianco. –

3

codice 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"/> 
+0

MIGLIORE RISPOSTA - Hai ottenuto il mio upvote! – TwoStarII

0

Se si utilizza libreria di supporto AppCompat .. questo potrebbe aiutare ..

<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> 
Problemi correlati