2011-10-14 36 views
7

我想顯示PreferenceActivity,它被設置爲Theme.Light對話框。該對話框顯示了在深色背景深色文字:Android:從Theme.Light活動顯示對話框問題

enter image description here

我認爲它使用深色文本,因爲它繼承了父活動,或類似文字的顏色。我希望對話框可以在黑色背景上使用白色文字,也可以使用帶有深色文字的白色背景,因爲PreferenceActivity設置爲Theme.Light時會執行此操作。

這似乎是一個已知問題,我發現的解決方法涉及創建和使用擴展Theme.Dialog並使用它來實例化對話框的自定義樣式。例如:

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

我試過這個,但沒有區別。我還爲textColor嘗試了許多不同的值,其中沒有一個修改了對話框的文本顏色。作爲一個全面的檢查,我說:

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

的風格,這就造成了紅色背景的對話(讓我確信,我實例化對話框正確)。

離我最近的一個解決方案就是將對話框的背景顏色設置爲白色,這會給出下面的對話框。但是,這不是一個很好的解決方案,因爲一些版本或者一些設備可能不會使用相同的行爲反轉文本顏色,當我看到:

enter image description here

那麼,有沒有設置文本顏色上的好方法從Theme.Light活動顯示對話框?

+0

我似乎記得與類似的東西掙扎。從來沒有得到它的工作。我最終的解決方法是擁有多個價值資源,其中一個將薑餅的顏色定義爲黑色,即在res/values-v8中,以及在res/values中爲淡色。 –

+0

我的誘惑是將列表的背景硬編碼爲白色,列表的文字顏色爲黑色。希望這可以保證白色背景上的黑色文本,而不管設備或版本。 – ab11

+0

好的,那肯定會奏效。但我認爲這種痛苦的關鍵是融入設備主題......薑餅比以前的版本要暗很多,因此是特殊情況。 –

回答

1

我假定您使用AlertDialog.Builder並使用setSingleChoiceItems方法之一設置列表,該方法不使用您自己的ListAdapter。相反,它使用錯誤的風格創建自己的。爲了解決這個問題,你應該打電話setSingleChoiceItems(ListAdapter adapter, int checkedItem, DialogInterface.OnClickListener listener),並提供這樣一個適配器,它將使用所需樣式的佈局。

現在,爲什麼會發生這種情況。實際適配器創作發生在文件com.android.internal.app.AlertController,其中以下線路選擇單一選擇列表中的佈局:

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

這裏是與上述的佈局:

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

正如你所看到的,線,設置文本顏色不包含對主題的引用,但是包含硬連線顏色。這就是爲什麼當這個東西在列表創建期間膨脹時,它總是會使用相同的顏色,而不管你希望它使用什麼風格。所以解決這個問題的正確方法是使用你自己的佈局和你自己的ListAdapter