Android Alert Dialog Fondo de aplicación API 11+

Creo un AlertDialog con el código de abajo. Por alguna razón estoy obteniendo un fondo extra (ver foto) en Honeycomb y arriba. El código falla bien para cualquier cosa debajo del nido de abeja. MyCustomDialog es simplemente Theme.Dialog para <API-11 y Theme.Holo.Dialog para API-11 y Theme.Holo.Dialog posteriores.

  1. ¿Alguna idea de por qué estoy obteniendo el fondo extra?
  2. ¿Alguna idea de por qué se bloquea para API <11? Funciona bien si elimino el tema.

Actualización descubrió la respuesta a la pregunta # 2. Parece que el constructor AlertDialog.Builder(Context context, int theme) fue introducido en la API 11. Mi solución fue simplemente 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 necesito ayuda con la pregunta # 1

Introduzca aquí la descripción de la imagen

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

Calculó las respuestas

  1. AlertDialog lo tiene en constantes estáticas para cada tema en la clase AlertDialog y no toma el tema estándar. Cuando reemplazé R.style.MyTheme o android.R.style.Theme_Holo_Dialog con AlertDialog.THEME_HOLO_LIGHT el código funcionó bien.
  2. Parece que el constructor AlertDialog.Builder(Context context, int theme) fue introducido en la API 11. Mi solución fue simplemente 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); } 

Usted puede intentar utilizar new AlertDialog.Builder(new ContextThemeWrapper(this, R.style.JumpDialog)) vez de new AlertDialog.Builder(this, R.style.JumpDialog)

Para aquellos que buscan una manera de personalizar el tema del diálogo sin tener que quedarse con los predeterminados (como en la solución aceptada), a partir de Lollipop parece que el fondo extra se ha eliminado finalmente. Por lo tanto, ahora puede crear un tema que hereda del predeterminado (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); 

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

  • Problemas de prueba OpenGL ES2 Alpha
  • Android desventajas de no cerrar el cursor
  • Cómo quitar la biblioteca de soporte (appcompat_v7)
  • No se puede resolver el método 'show (android.support.v4.app.FragmentManager, java.lang.String)
  • Tener la aplicación ejecutándose sobre otra aplicación
  • Pasar objetos personalizados entre actividades?
  • La mejor manera de manejar las referencias de Firebase con Android
  • Reflexión para acceder a funciones avanzadas de telefonía
  • Android pantalla completa una actividad y ocultar la barra de teclas
  • Uso de TelephonyManager para obtener SIM CÓDIGO DE PAÍS - ¿Cómo?
  • Objeto de almacenamiento Robospice que extiende ArrayList en la base de datos a través de Ormlite
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.