2011-10-14 34 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