Как установить акцент PreferenceFragmentCompat в цвете?

Я хотел бы переопределить AccentColor, используемый PreferenceFragmentCompat версии 14.

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

Для детских занятий я использую их со стандартным бирюзовым акцентным цветом. Однако у меня есть соответствие PreferenceFragment в ящике основного действия, и я не могу понять, как переопределить цвет акцента основного действия.

Вещи, которые я пробовал (ничего из этого не работает):

Установка темы на кадр фрагмента, который получает PreferenceFragmentCompat (не работает):

<FrameLayout android:id="@+id/preferenceFragmentFrame" 
    android:layout_width="match_parent" android:layout_height="0dp"
    android:layout_weight="1"
    android:theme="@style/AppTheme.TealAccentColor"
    />

где стиль AppTheme.TealAccentColor предоставляет явный бирюзовый acccentColor.

Установка акцента в теме предпочтений (не работает):

  <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        ...
     <item name="preferenceTheme">@style/MyPreferenceThemeOverlay</item>
    </style>
    <style name=MyPreferenceThemeOverlay parent="PreferenceThemeOverlay.v14.Material>
         <item name="colorAccent">@color/colorAccentTeal</item>
    </style>

Добавление цвета акцента в PreferenceThemeOverlay Preference-v14 (не работает):

  <!-- use the library's theme-->
  <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        ...
     <item name="preferenceTheme">PreferenceThemeOverlay.v14.Material</item>
   </style>
   <!-- but add an accentColor item to the library's theme -->
   <style name="PreferenceThemeOverlay.v14">
        <item name="colorAccent">@color/colorAccentTeal</item>
   </style>

Независимо от того, что я делаю, PreferenceFragmentCompat вместо этого берет розовый цвет акцента из темы Activity.

Я уверен, что это как-то связано с разрывом между темой Activity и темой Fragment. Но для фрагмента нет элемента xml, поскольку PreferenceFragmentCompat предоставляет собственный макет.

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

Картинка может помочь:

введите здесь описание изображения


person Robin Davies    schedule 24.11.2015    source источник
comment
вы решили это тем временем?   -  person prom85    schedule 05.07.2016
comment
Мое решение: сделайте это наоборот, так как я не могу заставить PreferenceFragmentCompat вести себя. Установите бирюзовый цвет в качестве цвета акцента в теме приложения, а затем явно задайте цвет акцента для отдельных элементов управления во внешнем фрейме. :-П   -  person Robin Davies    schedule 07.07.2016
comment
Мое решение состоит в том, чтобы подклассифицировать классы Preference... и темировать их там... Мне нужна независимая от темы тематика в том смысле, что я не определяю темы в xml (только базовая темная/светлая тема) и позволяю своим пользователям выберите любой цвет в качестве основного/дополнительного/акцентного цвета...   -  person prom85    schedule 07.07.2016


Ответы (1)


Вы пытались переопределить android:colorAccent вместо colorAccent?

Используйте метод, который вы описали как «Установка акцента в теме предпочтений», просто измените имя атрибута.

Библиотека поддержки предпочтений вообще не учитывает appcompat, поэтому

  1. забудьте об атрибутах appcompat
  2. Я думаю, что атрибуты color* будут работать только в API 21.

Если вам нужно согласованное поведение, вы можете использовать настройка поддержки Android в моей библиотеке, которая предназначена для настройки подключения. и библиотеки поддержки appcompat.

Тогда ваш оригинальный стиль с colorAccent (без префикса) будет работать как положено.

person Eugen Pechanec    schedule 22.07.2018
comment
Не могу заставить себя поставить вам галочку с принятым ответом, так как я справился с этим другими способами. Но это отличный ответ, полный важных деталей. Но я проголосовал. - person Robin Davies; 23.07.2018
comment
Все в порядке, если вы точно помните, как вы ее решили, вы можете опубликовать ее как свой собственный ответ, чтобы помочь другим. - person Eugen Pechanec; 23.07.2018
comment
:-) Я опубликовал свое не очень удачное решение в качестве комментария пару лет назад (пусть настройки берут тему приложения и переопределяют тему всего остального). Если кто-то еще может подтвердить, что android:colorAccent работает, я был бы рад дать вам заслуженный голос. Я просто не в том положении, чтобы подтвердить это прямо сейчас. - person Robin Davies; 23.07.2018