Pregunta Android: cómo configurar correctamente el color del texto para los elementos de la lista en AlertDialog


Yo tengo un AlertDialog en mi aplicación. Contiene una lista de vistas personalizadas con TextView widgets dentro. Todo funciona bien en Android 2.x. los AlertDialog se crea con una lista blanca y texto negro en ella. Pero cuando ejecuto mi aplicación en dispositivos Android 3.x todos TextViews 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.

Aquí está un TextViewdefinición 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 usando textAppearanceSmallInverse Para el textAppearance atributo es una forma adecuada de establecer los parámetros de texto y debe funcionar en todos los dispositivos, pero parece que estaba equivocado. Entonces, ¿qué debo hacer para hacer AlertDialog mostrar los elementos de la lista correctamente en todas las plataformas? Gracias por adelantado.


7
2017-07-14 18:44


origen


Respuestas:


La solución es aprovechar el sistema de selección de recursos incorporado de Android. 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é de esta tutorial.

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>

Entonces, en tu TextView, especifica el estilo así:

<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" />

Vea el tutorial vinculado arriba para una explicación más larga.


2
2018-06-26 17:56



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í, obtiene la vista de lista y establece el color de fondo en blanco. Si desea cambiar el color del texto para cada una de las vistas de texto, debe definir su color en el diseño de la vista de texto, en este caso, negro:

android:textColor="#000000"

1
2017-07-15 00:46



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

dialogBuilder.setInverseBackgroundForced(true);

resuelve el problema muy bien.


1
2018-01-24 09:20



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
2017-07-14 19:01