2011-12-31 35 views
13

Creo un AlertDialog con el siguiente código. Por alguna razón estoy obteniendo un fondo adicional (ver foto) en Honeycomb y más arriba. El código bloquea bien por debajo de nido de abeja. MyCustomDialog es simplemente Theme.Dialog para < API-11 y Theme.Holo.Dialog para API-11 en adelante.Android Alert Dialog Background Issue API 11+

  1. ¿Alguna idea de por qué obtengo el fondo extra?
  2. ¿Alguna idea de por qué falla para API < 11? Funciona bien si elimino el tema.

La actualización resolvió la respuesta a la pregunta n. ° 2. Parece que el constructor AlertDialog.Builder(Context context, int theme) fue introducida en la API 11. Mi solución era simplemente para cambiar la línea a:

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

todavía necesita ayuda con la pregunta # 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; 
} 

Respuesta

17

dimos cuenta de la respuestas

  1. AlertDialog tiene it en constantes estáticas para cada tema en la clase AlertDialog y no toma el tema estándar. cuando I reemplazó R.style.MyTheme o android.R.style.Theme_Holo_Dialog con AlertDialog.THEME_HOLO_LIGHT el código funcionó solo bien.
  2. parece que el constructor AlertDialog.Builder(Context context, int theme) fue introducida en la API 11. Mi solución era simplemente para cambiar la línea 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

De 1.6 en adelante, debe usar Build.VERSION.SDK_INT en su lugar porque Build.VERSION.SDK está en desuso. – bCliks

+0

actualizó la respuesta para eliminar la API en desuso y el nivel api codificado – Ali

+0

por lo que "Integer.parseInt" ya no es necesario –

6

Usted puede tratar de utilizar new AlertDialog.Builder(new ContextThemeWrapper(this, R.style.JumpDialog)) en lugar de new AlertDialog.Builder(this, R.style.JumpDialog)

2

Para aquellos Buscando una manera de personalizar el tema del diálogo sin tener que seguir con los predeterminados (como en la solución aceptada), comenzando con Lollipop parece que el fondo adicional se ha eliminado finalmente. Por lo tanto, ahora se puede crear un tema de la herencia de la que viene por defecto (ejemplo, 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> 

Y instancia de su constructor con este código:

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

supuesto, esto también podría hacerse con los recursos carpetas (values/ y values-v21/).