2011-10-14 21 views
7

que estoy tratando de mostrar un cuadro de diálogo desde una PreferenceActivity, que se fija a Theme.Light. El diálogo muestra con el texto oscuro sobre un fondo oscuro:Android: Problema con la muestra de diálogo de Theme.Light actividad

enter image description here

Asumo que utiliza el texto oscuro, ya que hereda el color del texto de la actividad de los padres, o algo similar. Me gustaría que el cuadro de diálogo use texto blanco sobre fondo oscuro o utilice un fondo blanco con texto oscuro, como lo hace PreferenceActivity cuando se establece en Theme.Light.

Esto parece ser un problema conocido, las soluciones que he encontrado implican la creación y el uso de un estilo personalizado que se extiende Theme.Dialog y utilizarlo para crear una instancia del diálogo. Algo como:

<style name="CustomDialog" parent="@android:style/Theme.Dialog"> 
<item name="android:textColor">?android:attr/textColorPrimaryInverseDisableOnly</item> 
</style> 

Dialog dialog = new Dialog(context, R.style.CustomDialog); 

Intenté esto, pero no hizo la diferencia. También probé varios valores diferentes para textColor, ninguno de los cuales modificó el color del texto del diálogo. Como una comprobación de validez, añadí:

 <item name="android:background">#FFFF0000</item> 

al estilo, lo que resultó en un cuadro de diálogo con un fondo rojo (así que estoy seguro de que estoy una instancia del diálogo correctamente).

Lo más cerca que he llegado a una solución que se acaba de establecer el color de fondo del cuadro de diálogo de color blanco, que da el siguiente diálogo. Pero esto no es una buena solución, porque algunos de versión o algún dispositivo podrían no usar el mismo comportamiento que estoy viendo cuando se invierte el color del texto:

enter image description here

Entonces, ¿hay una buena manera de establecer el color del texto en una cuadro de diálogo mostrado desde una actividad Theme.Light?

+0

Me parece recordar que lucha con algo similar. Nunca lo hice funcionar. Mi eventual solución fue tener múltiples recursos de valor, uno que definía los colores como oscuros para Gingerbread, es decir, en res/values-v8, y como light in res/values. –

+0

Mi tentación es codificar el fondo de la lista en blanco, y el color del texto de la lista en negro. Con la esperanza de que esto garantice el texto en negro sobre fondo blanco, independientemente del dispositivo o la versión. – ab11

+0

Bueno, sí, eso sin duda funcionará. Pero asumí que el objetivo de este dolor era mezclarse con el tema del dispositivo ...Gingerbread era mucho más oscuro que las versiones anteriores, por lo tanto, es el caso especial. –

Respuesta

1

Supongo que usa AlertDialog.Builder y configura la lista usando uno de los métodos setSingleChoiceItems que no usa su propio ListAdapter. En cambio, crea el suyo propio con el estilo incorrecto. Para solucionar esto, debe llamar al setSingleChoiceItems(ListAdapter adapter, int checkedItem, DialogInterface.OnClickListener listener) y proporcionar dicho adaptador que usaría un diseño con el estilo necesario.

Ahora, ¿por qué sucede esto. La creación adaptador real ocurre en el archivo com.android.internal.app.AlertController, donde la línea siguiente selecciona el diseño de las listas de resultados individuales:

int layout = mIsSingleChoice 
        ? R.layout.select_dialog_singlechoice : R.layout.select_dialog_item; 

Aquí es la disposición antes mencionada:

<CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@android:id/text1" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:minHeight="?android:attr/listPreferredItemHeight" 
    android:textAppearance="?android:attr/textAppearanceLarge" 
    android:textColor="@android:color/primary_text_light_disable_only" 
    android:gravity="center_vertical" 
    android:paddingLeft="12dip" 
    android:paddingRight="7dip" 
    android:checkMark="@android:drawable/btn_radio" 
    android:ellipsize="marquee" 
/> 

Como se puede ver, la línea que establece que el color del texto no contiene una referencia a un tema, sino un color cableado. Es por eso que cuando esta cosa se infla durante la creación de la lista, siempre usará el mismo color, independientemente del estilo que desee usar. Entonces, la acción correcta para superar este problema es usar su propio diseño y su propio ListAdapter.

Cuestiones relacionadas