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/ ).

  • Quitar fragmento de bloqueo
  • Visualización de elementos de menú en la barra de acciones de Android ICS
  • Incapaz de reemplazar / navegar fragmentos
  • Cómo detectar fotos oscuras en Android
  • Google Analytics para Android: establece información sobre dispositivo móvil
  • Acceso a WebView desde otra función en la clase MainActivity
  • ¿Por qué no funciona mi servicio en Android? (Sólo quiero registrar algo nunca 5 segundos)
  • ¿Cómo implementar diferentes eventos mediante un solo toque y doble toque en libgdx?
  • Intenta invocar el método virtual 'java.lang.Class java.lang.reflect.Field.getType ()' en una referencia de objeto nulo
  • ¿Cómo aplicar span de fila en tablelayout?
  • No se puede encontrar la ubicación de Android SDK para establecer la preferencia Eclipse
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.