Android: Как правильно установить цвет текста для элементов списка в AlertDialog - PullRequest
7 голосов
/ 14 июля 2011

У меня есть AlertDialog в моем приложении. Он содержит список пользовательских представлений с TextView виджетами внутри. Все отлично работает на Android 2.x. AlertDialog создан с белым списком и черным текстом в нем. Но когда я запускаю свое приложение на устройствах Android 3.x, все TextView s черные, а фон списка тоже черный. Поэтому я не вижу текст, пока не нажму и не удержу один из предметов.

Вот определение TextView из файла макета:

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

Я думал, что использование textAppearanceSmallInverse для атрибута textAppearance является правильным способом установки параметров текста и должно работать на всех устройствах, но, похоже, я ошибался. Итак, что я должен сделать, чтобы AlertDialog правильно отображал элементы списка на всех платформах? Заранее спасибо.

Ответы [ 4 ]

3 голосов
/ 26 июня 2012

Решением является использование встроенной в Android системы выбора ресурсов.Вы должны указать два разных стиля и поместить их в соответствующие папки в зависимости от версии API.Обратите внимание, что следующие примеры не мои, я взял их из этого учебника.

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>

Затем в вашем TextView укажите стиль следующим образом:

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

Более подробное объяснение см. В учебном руководстве, указанном выше.

1 голос
/ 24 января 2013

Принятый ответ кажется немного излишним.Я просто включил обратный фон, вызвав:

dialogBuilder.setInverseBackgroundForced(true);

решает проблему просто отлично.

1 голос
/ 15 июля 2011

Ваш код для всплывающего диалога должен выглядеть примерно так:

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

Здесь вы получаете вид списка и устанавливаете цвет фона на белый. Если вы хотите изменить цвет текста для каждого из текстовых представлений, вам нужно определить их цвет в макете текстового представления, в данном случае черный:

android:textColor="#000000"
0 голосов
/ 14 июля 2011

Это, вероятно, происходит потому, что вы не указываете тему, тогда она возвращается к теме по умолчанию.В 2.x это должно быть Theme.Black и в 3.x Theme.Holo (или Theme.Light, не уверен в этом).Затем textAppearanceSmallInverse разрешает разные стили в каждой теме.

...