Подтвердить что ты не робот

Android: цвет/стиль DialogPreference?

Моя основная активность предпочтений установлена ​​на "@android:style/Theme.Light". Одним из моих предпочтений является DialogPreference, который Dialog содержит ListView. Диалоговое окно ListView темно-серого (потому что DialogPreference использует AlertBuilder, который создает темно-серые диалоги), а текст в списке черный (потому что Theme.Light вызывает listViews для черного текста). Есть ли простой способ заставить ListView вести себя с тем же стилем, что и темный диалог? Или заставить темный диалог вести себя в том же стиле, что и активность света?

EDIT:

Основываясь на комментариях Merlin, кажется, что я должен попытаться создать тему LightDialog. Для этого я попытался: 1. расширить андроид Theme.Light и добавить свойства dialogy из 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. расширение андроидной темы .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?

4b9b3361

Ответ 1

Вы можете наследовать ненужные темы при создании стилей в Android.

Прочтите документацию Применение стилей и тем, в частности раздел о наследовании

Вы должны иметь возможность использовать Theme.light и исправлять любые проблемы, которые у вас есть.

Вы можете обнаружить, что разные производители изменяют темы на своих устройствах, поэтому, если вы ориентируетесь на широкий спектр аппаратных средств, тогда вам может быть лучше создать полную тему, чтобы обеспечить совместимость вашего приложения на всех платформах.

UPDATE

Как указано в этом ответе Совместимый цвет пользовательского интерфейса на всех устройствах Android, существуют общедоступные и непубличные атрибуты. Ответ содержит ссылку на список публичных атрибутов, однако kernel.org все еще недоступен, поэтому вам нужно будет прорваться через источник core/res/res/значения/public.xml

Ответ 2

Вы можете указать стиль диалога 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>

Ответ 3

У меня есть решение, как вы можете сделать это программно (я думаю, что это проще):

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

...

}