2011-10-14 10 views
7

Próbuję wyświetlić okno dialogowe z pola PreferenceActivity, które jest ustawione na Theme.Light. Okno pokazuje ciemną tekst na ciemnym tle:Android: Problem z wyświetlaniem okna dialogowego z działania Theme.Light

enter image description here

Zakładam, że używa ciemny tekst, ponieważ dziedziczy kolor tekstu z działalności macierzystej, lub coś podobnego. Chciałbym, aby okno dialogowe korzystało z białego tekstu na ciemnym tle lub użyj białego tła z ciemnym tekstem, gdy funkcja PreferenceActivity jest ustawiona na Theme.Light.

To wydaje się być znanym problemem, obejścia, które znalazłem, obejmują tworzenie i używanie niestandardowego stylu, który rozszerza Theme.Dialog i używa go do utworzenia wystąpienia w oknie dialogowym. Coś jak:

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

Próbowałem tego, ale to nie miało znaczenia. Próbowałem również wiele różnych wartości dla textColor, z których żaden nie zmodyfikował koloru tekstu Dialog. Jako kontrola poprawności, dodałem:

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

do stylu, co zaowocowało w oknie z czerwonym tle (tak, jestem pewien, że jestem instancji okno prawidłowo).

Najbliższym rozwiązaniem jest ustawienie koloru tła okna na biały, co daje poniższe okno dialogowe. Ale to nie jest dobrym rozwiązaniem, ponieważ niektóre wersja lub niektóre urządzenia nie mogą korzystać z tego samego zachowanie widzę gdy odwracanie Kolor tekstu:

enter image description here

tak, to czy jest to dobry sposób, aby ustawić kolor tekstu na dialog wyświetlany z działania Theme.Light?

+0

Wydaje mi się, że pamiętam walkę z czymś podobnym. Nigdy nie działało. Moim ostatecznym rozwiązaniem było posiadanie wielu zasobów wartości, które określały kolory ciemne w przypadku Gingerbread, tj. W res/values-v8 i jako light w res/values. –

+0

Moja pokusa polega na tym, żeby na twardym pasku tło listy było białe, a kolor tekstu listy na czarny. W nadziei, że to zagwarantuje czarny tekst na białym tle, niezależnie od urządzenia lub wersji. – ab11

+0

No tak, to z pewnością zadziała. Ale założyłem, że celem tego bólu było połączenie z motywem urządzenia ...Piernik był o wiele ciemniejszy niż wcześniejsze wersje, dlatego jest to specjalny przypadek. –

Odpowiedz

1

Zakładam, że używasz AlertDialog.Builder i ustawiasz listę przy użyciu jednej z metod setSingleChoiceItems, która nie wykorzystuje własnego ListAdapter. Zamiast tego tworzy własny zamiast tego ze złym stylem. Aby to naprawić, należy zadzwonić pod numer setSingleChoiceItems(ListAdapter adapter, int checkedItem, DialogInterface.OnClickListener listener) i dostarczyć taki adapter, który będzie korzystał z układu o wymaganym stylu.

Dlaczego tak się dzieje. Faktyczne tworzenie adapter dzieje w pliku com.android.internal.app.AlertController, gdzie po linii wybiera układ dla list pojedynczych wyboru:

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

Oto wspomniany układ:

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

Jak widać, linia, która ustawia kolor tekstu nie zawiera odniesienia do motywu, lecz kolor przewodowy. Dlatego, gdy ta rzecz zostanie nadmuchana podczas tworzenia listy, zawsze będzie używać tego samego koloru, niezależnie od tego, jakiego stylu chcesz użyć. Więc właściwym działaniem, aby przezwyciężyć ten problem, jest użycie własnego układu i własnego ListAdapter.

Powiązane problemy