Android: Как правильно установить цвет текста для элементов списка в AlertDialog

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

Вот определение 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 отображал элементы списка на всех платформах? Заранее спасибо.

Решение состоит в том, чтобы использовать встроенную систему выбора ресурсов 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" /> 

См. Урок, приведенный выше для более подробного объяснения.

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

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

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

 android:textColor="#000000" 

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

 dialogBuilder.setInverseBackgroundForced(true); 

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

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