2013-11-02 13 views
14

Quando si utilizza Theme.Sherlock.Light.DarkActionBar (o Theme.Holo.Light.DarkActionBar, non fa alcuna differenza), l'ActionMode (o "ActionBar contestuale") che appare ad esempio quando si seleziona il testo, è di default disegnato allo stesso modo del tema scuro standard, cioè blu scuro con icone di azione chiare.Icone oggetto ActionMode invisibili in Theme.Sherlock.Light.DarkActionBar

Tuttavia, quando si tenta di selezionare un testo in una finestra di dialogo (che è in stile luminoso in questo tema, in contrasto con l'ActionBar nero), viene visualizzato un ActionMode in stile come nel tema Luce (sfondo bianco). Il problema è che le sue icone di azione non sono oscure come dovrebbero essere, ma leggere, rendendole effettivamente invisibili.

enter image description here

Questo sembra come se lo sfondo è stata presa dal tema della luce (a causa della finestra di luce), ma le icone sono state prese dal tema scuro. Si tratta di un bug nel tema Light.DarkActionBar? Posso fare qualcosa al riguardo?

+0

Non trovo una soluzione per questa situazione, sembra che il tema della barra delle azioni di AlertDialog possa essere uguale a se stesso. Ma una soluzione alternativa è usare un altro DialogFragment per mostrare il contenuto di AlertDailog, in questo modo possiamo avere un metodo di azione Light.DarkActionBar senza problemi – henry74918

risposta

9

Stavo combattendo con lo stesso problema dagli ultimi due giorni. Finalmente ho trovato una soluzione!

Sto utilizzando un DialogFragment con un oggetto AlertDialog. Nel metodo onCreateDialog(), tutto ciò che dobbiamo fare è ottenere il contesto dell'attività genitore e impostare nuovamente il suo tema su Theme.Light.

@Override 
public Dialog onCreateDialog(Bundle savedInstanceState) { 
    //get the parent activity context and set it's theme again. 
    Context ctx = getActivity(); 
    ctx.setTheme(android.R.style.Theme_Holo_Light); 
    AlertDialog.Builder builder = new AlertDialog.Builder(ctx); 
    LayoutInflater inflater = (LayoutInflater) ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    View view = inflater.inflate(R.layout.your_dialog_layout, null, false); 
    builder.setView(view); 

    //your other code for the dialog 
    // 

    return builder.create(); 

Ora le icone nella ActionBar contestuale del EditText hanno il colore giusto.

+0

Grazie, questo davvero aiutato! Solo una cosa, probabilmente vuoi dire _set è il tema di Theme.Light_ - come nel frammento di codice. – Natix

+1

Oh sì, ho modificato la mia risposta, ma puoi impostare il tema su DarkActionBar per ottenere il CAB blu scuro. :) –

+1

Light.DarkActionBar non funziona per me, le icone sono bianche su sfondo bianco come sopra. Solo il tema Light risolve il problema. – Natix

-1

La soluzione è quella di utilizzare il contesto del ActionBar per creare l'AlertDialog:

Context themedContext = getActivity().getActionBar().getThemedContext(); 

o utilizzando ActionBarSherlock/ActionBarCompat:

Context themedContext = getActivity().getSupportActionBar().getThemedContext(); 

quindi creare l'AlertDialog utilizzando questo contesto a tema:

AlertDialog.Builder builder = new AlertDialog.Builder(themedContext); 
+1

questo renderizzerà la finestra di avviso usando darkTheme, non la luce. Theme – henry74918

+0

Non funziona per me, non fa nulla sul mio Android 4.4.4, Cyanogenmod –

+0

@ henry74918 questo renderà il tuo dialogo coerente con il tema della tua attività. Se vuoi qualcosa di personalizzato/diverso, dovresti leggere le altre risposte che forzano un tema. – Murphy

2

Forzatura setTheme nel contesto corrente non è una buona idea, in quanto corrompe il tema. Per risolvere questo è possibile utilizzare ContextThemeWrapper.

Context themedContext = new ContextThemeWrapper(getActivity(), android.R.style.Theme_Holo_Light); 
final AlertDialog dialog = new AlertDialog.Builder(themedContext) 
+3

Questo non funziona, le icone sono ancora nascoste. Testato su Nexus 7 4.4.2. –

+0

Verificato, non funziona neanche sul mio 4.4.4 CyanogenMod. –

2

Ho affrontato lo stesso problema. Uso un tema personalizzato ereditato da Theme.AppCompat.Light. Nel mio tema ho sostituito l'elemento actionModeTheme con il mio elemento di stile personalizzato. Ma ho affrontato il problema come tuo problema. Per risolvere questo problema basta sostituire l'elemento android:alertDialogTheme nel tema personalizzato.

<style name="AppTheme" parent="@style/Theme.AppCompat.Light"> 
     ... 
     <item name="android:alertDialogTheme">@style/AppBaseTheme</item> 
     ... 
</style> 

<style name="AlertDialogTheme"> 
     ... 
     <item name="android:actionModeStyle">@style/ActionModeStyle</item> 
     ... 
</style> 
<style name="ActionModeStyle" parent="Widget.AppCompat.Base.ActionMode"> 
      ... 
      <item name="android:background">@color/gray</item> 
      ... 
</style> 

Nota, funziona dal livello api 11.

+0

non ha aiutato. Le icone sono ancora nascoste. OS 4.1.2 – netimen

2

Problema:

App tema è ereditato da Android: Theme.Light, e non c'è nessun tema dedicato per AlertDialog, in modo che gli elementi ActionMode sono in qualche modo invisibile.


Soluzione:

1. Creare un tema dedicato per AlertDialog;

<style name="AppTheme" parent="android:Theme.Light"> 
</style> 
<style name="AlertDialogTheme" parent="AppTheme"> 
    <item name="android:windowIsFloating">true</item> 
    <item name="android:windowContentOverlay">@null</item> 
    <item name="android:windowCloseOnTouchOutside">true</item> 
    <item name="android:windowActionModeOverlay">true</item> 
    <item name="android:windowBackground">@android:color/transparent</item> 
    <item name="android:windowAnimationStyle">@android:style/Animation.Dialog</item> 
    <item name="android:windowMinWidthMajor">@android:dimen/dialog_min_width_major</item> 
    <item name="android:windowMinWidthMinor">@android:dimen/dialog_min_width_minor</item> 
    <item name="android:maxLines">1</item> 
    <item name="android:scrollHorizontally">true</item> 
    <item name="android:textColor">@android:color/holo_blue_light</item> 
</style> 

Nota: la linea più importante che rende la magia è <item name="android:textColor">@android:color/holo_blue_light</item>

2. Utilizzare il tema dedicato quando la costruzione di un AlertDialog.

AlertDialog.Builder builder = new AlertDialog.Builder(getActivity(), R.style.AlertDialogTheme); 

Si prega di dare un'occhiata alla schermata che mostra prima e dopo l'applicazione del tema.

screenshot

+0

Posso confermare che questo funziona su 4.4.2. – cgogolin

0

ho cercato soluzioni sopra indicati, l'unico che ha funzionato per me (ho app mirati per API 7, con AppCompat 21.0.3) è quello di impostare lo stile di finestra di dialogo per R.style.Theme_AppCompat. Sì, lo stupido dialogo è ora nero. Questo problema è presente anche in AppCompat 22.

final Context themedContext = new ContextThemeWrapper(activity, R.style.Theme_AppCompat); 
    builder = new AlertDialog.Builder(themedContext); 
    contents = ((LayoutInflater) themedContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.tag_editor, null); 
    builder.setView(contents); 
1

Aggiungi questo al vostro tema:

<item name="android:actionModeCutDrawable">@drawable/ic_menu_cut_holo_light</item> 
    <item name="android:actionModeCopyDrawable">@drawable/ic_menu_copy_holo_light</item> 
    <item name="android:actionModePasteDrawable">@drawable/ic_menu_paste_holo_light</item> 
    <item name="android:actionModeSelectAllDrawable">@drawable/ic_menu_selectall_holo_light</item> 

E poi aggiungere le risorse necessarie disegnabili al progetto che possono essere trovati qui: https://github.com/android/platform_frameworks_base/tree/master/core/res/res

0

Ho avuto lo stesso problema con l'applicazione che sto mantenendo La soluzione era molto semplice - ho appena dovuto modificare compileSdkVersion e targetSdkVersion all'ultimo