![](/img/trans.png)
[英]Android DialogPreference NullPointerException in onRestoreInstanceState
[英]Android: DialogPreference color/style?
我的主要偏好活动设置为"@android:style/Theme.Light"
。 我的一个偏好是DialogPreference,其Dialog包含ListView。 ListView的对话框为深灰色(因为DialogPreference使用AlertBuilder创建深灰色对话框),列表中的文本为黑色(因为Theme.Light导致listViews有黑色文本)。 是否有一种简单的方法可以使ListView的行为与黑暗对话框相同? 或者让黑暗的对话框表现出与灯光活动相同的风格?
编辑:
根据Merlin的评论,似乎我应该尝试做的是创建一个LightDialog主题。 为了做到这一点,我试过:1。扩展android的Theme.Light并从Theme.Dialog添加对话框属性
<style name="Theme.LightDialog" parent="@android:style/Theme.Light">
<item name="android:windowFrame">@null</item>
<item name="android:windowTitleStyle">@android:style/DialogWindowTitle</item>
<item name="android:windowBackground">@android:drawable/panel_background</item>
<item name="android:windowIsFloating">true</item>
<item name="android:windowContentOverlay">@null</item>
<item name="android:windowAnimationStyle">@android:style/Animation.Dialog</item>
</style>
...和2.扩展android的Theme.Dialog并添加Theme.Light的轻微属性。
<style name="Theme.LightDialog" parent="@android:style/Theme.Dialog">
<item name="android:windowBackground">@drawable/screen_background_light</item>
<item name="android:colorBackground">@android:color/background_light</item>
<item name="android:colorForeground">@androidcolor/bright_foreground_light</item>
<item name="android:colorForegroundInverse">@android:color/bright_foreground_light_inverse</item>
<item name="android:textColorPrimary">@android:color/primary_text_light</item>
<item name="android:textColorSecondary">@android:color/secondary_text_light</item>
<item name="android:textColorTertiary">@android:color/tertiary_text_light</item>
<item name="android:textColorPrimaryInverse">@android:color/primary_text_dark</item>
<item name="android:textColorSecondaryInverse">@android:color/secondary_text_dark</item>
<item name="android:textColorTertiaryInverse">@android:color/tertiary_text_dark</item>
<item name="android:textColorPrimaryDisableOnly">@android:color/primary_text_light_disable_only</item>
<item name="android:textColorPrimaryInverseDisableOnly">@android:color/primary_text_dark_disable_only</item>
<item name="android:textColorPrimaryNoDisable">@android:color/primary_text_light_nodisable</item>
<item name="android:textColorSecondaryNoDisable">@android:color/secondary_text_light_nodisable</item>
<item name="android:textColorPrimaryInverseNoDisable">@android:color/primary_text_dark_nodisable</item>
<item name="android:textColorSecondaryInverseNoDisable">@android:color/secondary_text_dark_nodisable</item>
<item name="android:textColorHint">@android:color/hint_foreground_light</item>
<item name="android:textColorHintInverse">@android:color/hint_foreground_dark</item>
</style>
这两种尝试均失败,因为它们使用非公共属性。 有关如何创建LightDialog主题的任何建议?
在Android中创建样式时,您可以继承defult主题。
请阅读有关应用样式和主题的文档,特别是有关继承的部分
您应该能够使用Theme.light并更正您遇到的任何问题。
您可能会发现不同的供应商会更改其设备上的主题,因此如果您的目标是广泛的硬件,那么您可能最好创建一个完整的主题,以确保您的应用在所有平台上都是一致的。
UPDATE
如此答案中所述, 所有Android设备中的一致UI颜色都有公共和非公共属性。 答案提供了一个公共属性列表的链接,但是kernel.org仍处于关闭状态,因此您需要挖掘核心/ res / res / values / public.xml的源代码
您可以使用android:alertDialogTheme
(从API 11
开始支持)指定DialogPreference
对话框的样式,它们是首选项活动的属性:
<style name="PreferencesActivityTheme" parent="@style/Theme.AppCompat.Light.DarkActionBar">
<item name="android:alertDialogTheme">@style/Theme.MyDialog</item>
</style>
<style name="Theme.MyDialog" parent="@style/Theme.AppCompat.Light.Dialog">
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
</style>
我有一个解决方案,你怎么能以编程方式(我认为它更简单的方式):
public class CustomDialogPreference extends DialogPreference {
...
@Override
protected void showDialog(Bundle state) {
super.showDialog(state);
//changing color of divider
int divierId = getDialog().getContext().getResources()
.getIdentifier("android:id/titleDivider", null, null);
View divider = getDialog().findViewById(divierId);
divider.setBackgroundColor(getContext().getResources().getColor(R.color.light_orange));
//changing color of title textview
int titleId = getDialog().getContext().getResources()
.getIdentifier("android:id/alertTitle", null, null);
TextView title = (TextView) getDialog().findViewById(titleId);
title.setTextColor(getContext().getResources().getColor(R.color.light_orange));
}
...
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.