我正在尝试从PreferenceActivity显示一个对话框,该对话框设置为Theme.Light。对话框在深色背景上显示深色文字:
我认为它使用深色文本,因为它是从父活动或类似的东西继承文本颜色。我希望对话框能够在深色背景上使用白色文本,或者使用带有深色文本的白色背景,就像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尝试了许多不同的值,但没有一个值修改了Dialog的文本颜色。作为一个完整性检查,我补充说:
<item name="android:background">#FFFF0000</item>
到样式,导致带有红色背景的对话框(所以我确信我正确地实例化对话框)。
我最接近解决方案的方法是将对话框的背景颜色设置为白色,这将给出以下对话框。但这不是一个好的解决方案,因为某些版本或某些设备可能不会使用我在反转文本颜色时看到的相同行为:
那么,有没有一种很好的方法在Theme.Light活动显示的对话框上设置文本颜色?
答案 0 :(得分:1)
我假设您使用AlertDialog.Builder
并使用其中一种不使用您自己的setSingleChoiceItems
的{{1}}方法设置列表。相反,它创建了自己的而不是错误的风格。要解决此问题,您应该调用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"
/>
。