2011-12-31 2 views
13

Creo un AlertDialog con il codice seguente. Per qualche motivo ho uno sfondo in più (vedi foto) su Honeycomb e sopra. Il codice si blocca bene per qualsiasi cosa al di sotto del nido d'ape. MyCustomDialog è semplicemente Theme.Dialog per < API-11 e Theme.Holo.Dialog per API-11 e versioni successive.Finestra di dialogo Android Alert background API 11+

  1. Qualche idea del motivo per cui sto ricevendo lo sfondo extra?
  2. Qualche idea sul perché si blocca per l'API < 11? Funziona bene se rimuovo il tema.

L'aggiornamento ha risolto la risposta alla domanda n. 2. Sembra il costruttore AlertDialog.Builder(Context context, int theme) è stato introdotto nel API 11. La mia difficoltà era semplicemente di cambiare la linea a:

final AlertDialog.Builder builder = (Integer.parseInt(android.os.Build.VERSION.SDK) < 11)? new AlertDialog.Builder(this) : new AlertDialog.Builder(this,R.style.JumpDialog); 

ho ancora bisogno di aiuto con la domanda # 1

enter image description here

private Dialog setupKeyBoardDialog() { 
    if (mContact.getLocaleId() != -1) { 
     final AlertDialog.Builder builder = new AlertDialog.Builder(this,R.style.MyCustomDialog); 
     builder.setTitle("Keyboards"); 

     mKeyboardLayouts = new KeyboardLayoutGroup(); 
     mKeyboardLayouts.layoutNames = new CharSequence[(int) jni.getNumKeyLayouts()]; 
     mKeyboardLayouts.layoutValue = new ArrayList<Integer>(); 

     for (int i = 0; i < jni.getNumKeyLayouts(); i++) { 
      mKeyboardLayouts.layoutNames[i] = jni.LayoutInfoForIndex(i).getName(); 
      mKeyboardLayouts.layoutValue.add(i, (int) jni.LayoutInfoForIndex(i).getLocale_id()); 
     } 

     final int selectedItem = mKeyboardLayouts.layoutValue.indexOf(mContact.getLocaleId()); 

     builder.setSingleChoiceItems(mKeyboardLayouts.layoutNames, selectedItem, new DialogInterface.OnClickListener() { 
      @Override 
      public void onClick(DialogInterface dialog, int item) { 
       mContact.setLocaleId(mKeyboardLayouts.layoutValue.get(item)); 
       mContactsDB.saveContact(mContact, true); 

       dialog.dismiss(); 
       initializeSettingsList(); 
      } 
     }); 

     final AlertDialog dialog = builder.create(); 
     dialog.setButton("Cancel", new DialogInterface.OnClickListener() { 
      @Override 
      public void onClick(DialogInterface dialogBox, int arg1) { 
       dialogBox.cancel(); 
      } 
     }); 

     return dialog; 
    } 

    return null; 
} 

risposta

17

capito il risposte

  1. AlertDialog ha le costanti statiche per ogni tema nella classe AlertDialog e non prende il tema standard. quando I sostituito R.style.MyTheme o android.R.style.Theme_Holo_Dialog con AlertDialog.THEME_HOLO_LIGHT il codice ha funzionato solo bene.
  2. Sembra il costruttore AlertDialog.Builder(Context context, int theme) è stato introdotto nel API 11. La mia difficoltà era semplicemente di cambiare la linea a:

    final AlertDialog.Builder builder; 
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) { 
        builder = new AlertDialog.Builder(this); 
    } else { 
        builder = new AlertDialog.Builder(this,R.style.JumpDialog); 
    } 
    
+0

Dalla versione 1.6 in poi, è necessario utilizzare Build.VERSION.SDK_INT invece perché Build.VERSION.SDK è obsoleto. – bCliks

+0

aggiornato la risposta per rimuovere l'api deprecato e il livello API codificato – Ali

+0

così "Integer.parseInt" non è più necessario –

6

Si può provare a utilizzare new AlertDialog.Builder(new ContextThemeWrapper(this, R.style.JumpDialog)) invece di new AlertDialog.Builder(this, R.style.JumpDialog)

2

Per coloro alla ricerca di un modo per personalizzare il tema del dialogo senza dover rimanere con quelli predefiniti (come nella soluzione accettata), a partire da Lollipop sembra che lo sfondo extra sia stato finalmente rimosso. Quindi, ora è possibile creare un tema che eredita da quella di default (ad esempio con AppCompat):

<!-- default theme for L devices --> 
<style name="SelectionDialog" parent="Theme.AppCompat.Light.Dialog"> 
    <item name="android:textColor">@color/default_text_color_holo_light</item> 
</style> 
<!-- theme for Pre-L devices --> 
<style name="SelectionDialog.PreL"> 
    <!-- remove the dialog window background --> 
    <item name="android:windowBackground">@color/transparent</item> 
</style> 

E istanziare il costruttore con questo codice:

AlertDialog.Builder builder = new AlertDialog.Builder(
      getActivity(),     
      Build.VERSION.SDK_INT > Build.VERSION_CODES.KITKAT ? 
        R.style.SelectionDialog : 
        R.style.SelectionDialog_PreL); 

Naturalmente questo potrebbe essere fatto anche con risorse cartelle (values/ e values-v21/).