Android:DialogPreference颜色/样式?

时间:2011-04-15 19:25:41

标签: android

我的主要偏好设置活动设为"@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主题的任何建议吗?

3 个答案:

答案 0 :(得分:4)

在Android中创建样式时,您可以继承defult主题。

请阅读Applying Styles and Themes上的文档,特别是有关继承的部分

您应该能够使用Theme.light并更正您遇到的任何问题。

您可能会发现不同的供应商会更改其设备上的主题,因此如果您要定位广泛的硬件,那么您可能最好创建一个完整的主题,以确保您的应用在所有平台上都是一致的。

<强>更新

如本回答Consistent UI color in all Android devices所述,有公共和非公共属性。答案提供了一个公共属性列表的链接,但是kernel.org仍处于关闭状态,因此您需要深入了解core/res/res/values/public.xml的来源

答案 1 :(得分:1)

您可以使用DialogPreference(从android:alertDialogTheme开始支持)首选项活动的属性来指定API 11对话框的样式:

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

答案 2 :(得分:0)

我有一个解决方案,你可以用编程方式做到这一点(我认为它更容易):

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

...

}