2011-07-14 11 views
7

Tengo un AlertDialog en mi aplicación. Contiene una lista de vistas personalizadas con widgets TextView dentro. Todo funciona bien en Android 2.x. El AlertDialog se crea con una lista blanca y texto negro. Pero cuando ejecuto mi aplicación en dispositivos Android 3.x todos los TextView s son negros y el fondo de la lista también es negro. Así que no puedo ver el texto hasta que toque y mantenga presionado uno de los elementos.Android: Cómo establecer el color del texto para los elementos de la lista en AlertDialog correctamente

Aquí es la definición de un TextView 's del archivo de diseño:

<TextView 
    android:id="@+id/label" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:singleLine="true" 
    android:ellipsize="marquee" 
    android:textAppearance="?android:attr/textAppearanceSmallInverse" /> 

pensé que el uso de textAppearanceSmallInverse para el atributo textAppearance es una forma correcta de establecer los parámetros de texto y debe funcionar en todos los dispositivos, pero parece que estaba incorrecto. Entonces, ¿qué debo hacer para que AlertDialog muestre correctamente los elementos de la lista en todas las plataformas? Gracias por adelantado.

+1

Esta pregunta es bastante antigua, pero tal vez alguien más se beneficie de esto. La solución es aprovechar la selección de recursos incorporada de Android para lograr lo que estás buscando. Ver [este] (http://kmansoft.com/2011/10/15/alertdialog-custom-listview-items-and-honeycomb/) tutorial para obtener instrucciones. – howettl

+0

Usé exactamente el mismo enfoque en mi proyecto, pero esperaba una mejor solución. – Michael

+0

¿Por qué se eliminó mi respuesta? – howettl

Respuesta

2

La solución es aprovechar de Android incorporado sistema de selección de recursos. Debe especificar dos estilos diferentes y colocarlos en las carpetas adecuadas en función de la versión de la API. Tenga en cuenta que los siguientes ejemplos no son míos, los tomé del tutorial this.

res/values-v4/styles.xml:

<resources> 

<!-- Text for listboxes, inverted for Andorid prior to 3.0 --> 

<style name="MyListTextAppearanceSmall"> 
    <item name="android:textAppearance">?android:attr/textAppearanceSmallInverse</item> 
</style> 

<style name="MyListTextAppearanceDefault"> 
    <item name="android:textAppearance">?android:attr/textAppearanceInverse</item> 
</style> 

<style name="MyListTextAppearanceMedium"> 
    <item name="android:textAppearance">?android:attr/textAppearanceMediumInverse</item> 
</style> 
</resources> 

res/values-v11/styles.xml:

<resources> 
    <!-- Text for listboxes, non-inverted starting with Android 3.0 --> 

    <style name="MyListTextAppearanceSmall"> 
     <item name="android:textAppearance">?android:attr/textAppearanceSmall</item> 
    </style> 

    <style name="MyListTextAppearanceDefault"> 
     <item name="android:textAppearance">?android:attr/textAppearance</item> 
    </style> 

    <style name="MyListTextAppearanceMedium"> 
     <item name="android:textAppearance">?android:attr/textAppearanceMedium</item> 
    </style> 
</resources> 

Luego, en su TextView, especificar el estilo de este modo:

<TextView 
    android:style="@style/MyListTextAppearanceSmall" 
    android:id="@+id/label" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:singleLine="true" 
    android:ellipsize="marquee" /> 

Ver el tutorial vinculado anteriormente para una explicación más largo .

0

Esto probablemente ocurra porque no está especificando un tema, luego vuelve al tema predeterminado. En 2.x esto debería ser Theme.Black y en 3.x Theme.Holo (o Theme.Light, no estoy seguro de esto). Entonces textAppearanceSmallInverse se resuelve con un estilo diferente en cada tema.

+0

Estoy usando 'Theme' en 2.x y 'Theme.Holo' en 3.x. Pero el problema es que 'AlertDialog' usa estilos opuestos en diferentes plataformas. Pero ambas plataformas usan el mismo estilo para el texto del título. Eso es un comportamiento extraño. – Michael

1

Su código para el diálogo emergente debe ser similar a esto:

// Sets dialog for popup dialog list 
AlertDialog dialog; 
String[] items = {"exampleItem"}; 
ListAdapter itemlist = new ArrayAdapter(this, android.R.layout.simple_list_item_1, items); 
AlertDialog.Builder builder = new AlertDialog.Builder(this); 
builder.setTitle("Title"); 
builder.setAdapter(itemlist, new DialogInterface.OnClickListener() 
{ 
    public void onClick(DialogInterface dialog, int item) 
    { 
    } 
}); 
dialog = builder.create(); 
dialog.getListView().setBackgroundColor(Color.WHITE); 

Aquí, usted está recibiendo la vista de lista y establecer el color de fondo a blanco. Si desea cambiar el color del texto para cada uno de los textviews entonces usted necesita para definir su color en el diseño de la Vista de Texto, en este caso negro:

android:textColor="#000000" 
+0

Gracias por su respuesta, pero no quiero cambiar el fondo de la lista. Quiero que se vea como debería verse en una plataforma en particular. Todo lo que quiero es establecer un estilo de texto adecuado para que sea legible en todas las plataformas. – Michael

1

La respuesta aceptada parece un poco exagerada. Simplemente forcé el fondo inverso llamando al:

dialogBuilder.setInverseBackgroundForced(true); 

resuelve el problema muy bien.

+0

Por lo que recuerdo, esta bandera no resuelve el problema tanto en Android 2.x como en Android 3.x. – Michael

+1

setInverseBackgroundForced ahora está en desuso –

Cuestiones relacionadas