Как изменить цвет текста категории предпочтений в Android?

Атрибут textColor не работает. Вот мой XML:

<PreferenceCategory
        android:title="Title"
        android:textColor="#00FF00">

Любые идеи?


person Michael Eilers Smith    schedule 23.07.2012    source источник


Ответы (12)


используйте этот класс настройки PreferenceCategory:

public class MyPreferenceCategory extends PreferenceCategory {
    public MyPreferenceCategory(Context context) {
        super(context);
    }

    public MyPreferenceCategory(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public MyPreferenceCategory(Context context, AttributeSet attrs,
            int defStyle) {
        super(context, attrs, defStyle);
    }

    @Override
    protected void onBindView(View view) {
        super.onBindView(view);
        TextView titleView = (TextView) view.findViewById(android.R.id.title);
        titleView.setTextColor(Color.RED);
    }
}

и добавьте это в свой файл Pref.xml:

<ali.UI.Customize.MyPreferenceCategory android:title="@string/pref_server" />
person AliSh    schedule 23.07.2012
comment
Я обнаружил, что findViewById() по-прежнему не работает в onBindView(). Вместо этого я сделал это в onCreateView(), и это сработало. - person ryan; 20.09.2013
comment
titleView.setTextColor(Color.RED); бросает NullPointerException. Любое исправление? - person Anggrayudi H; 25.11.2015
comment
Обратите внимание, что нужно заменить ali.UI.Customize на имя пакета вашей собственной категории MyPreferenceCategory. - person Al Lelopath; 05.10.2016
comment
Большое спасибо! Это код для переопределения android.support.v7.preference.PreferenceViewHolder вместо метода onBindView: @Override public final void onBindViewHolder(final PreferenceViewHolder vh) { super.onBindViewHolder(vh); TextView txt = (TextView) vh.findViewById(android.R.id.title); txt.setTextColor(Color.RED); } - person Fernando Jascovich; 07.06.2017

Одним из решений является создание темы для вашего PreferenceScreen. Итак, в вашем файле themes.xml или styles.xml (лучше поместить его в файл themes.xml):

<style name="PreferenceScreen" parent="YourApplicationThemeOrNone">
    <item name="android:textColor">@color/yourCategoryTitleColor</item>
</style>

затем в вашем AndroidManifest.xml:

<activity
      android:name="MyPreferenceActivity"
      ...
      android:theme="@style/PreferenceScreen" >
</activity>

Это сработало отлично для меня.

person flawyte    schedule 23.07.2012
comment
@Javi То же самое здесь, этот ответ позволяет вам динамически изменять детали темы! :) - person varun; 05.03.2019
comment
Черт возьми, как все остальные ответы везде такие сложные и длинные, когда ты можешь сделать это таким простым?? Спасибо! - person Big_Chair; 27.02.2020
comment
Это сработало отлично, но вам нужно добавить эти строки в стиль ‹item name=android:textColorTertiary›@color/with‹/item› ‹item name=android:textColorSecondary›@color/with‹/item› - person MohammadReza; 08.06.2020
comment
Это по-прежнему не меняет цвет заголовка PreferenceCategory (` ‹PreferenceCategory android:title=Settings›`) - person James Poulose; 03.04.2021

Простой способ сделать это — установить пользовательский макет для PreferenceCategory здесь:

<PreferenceCategory
    android:layout="@layout/preferences_category"
    android:title="Privacy" >

Затем установите свой код в файл макета preferences_category:

<TextView
    android:id="@android:id/title"
    android:textColor="@color/deep_orange_500"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:textSize="16sp"
    android:textStyle="bold"
    android:textAllCaps="true"/>

person Simon    schedule 09.01.2016
comment
Лучшее решение, потому что у вас есть прямой контроль над всем внутри текстового представления. - person Stoycho Andreev; 26.07.2016
comment
ты спасатель жизни! - person CppChase; 22.12.2016
comment
Это действительно проще, чем другие решения, представленные в ответах на похожие вопросы! Спасибо!!! - person mvsagar; 13.03.2017
comment
Я не могу получить текст из заголовка категории в layout-textView, это просто пустая область. Как добавить? - person Felix Eder; 10.02.2018
comment
Лучшее решение +1 - person Aziz; 04.07.2020
comment
Часть android:id=@android:id/title необходима для отображения текста категории предпочтений. - person Marcell; 22.12.2020

Чтобы изменить цвет текста в категории предпочтений, установите тему PreferenceActivity в манифесте Android и убедитесь, что элемент colorAccent существует. Этот цвет принимает ваш PreferenceCategory.

person Efren    schedule 01.06.2016
comment
Это правильный ответ! Добавьте ‹item name=colorAccent›@android:color/white‹/item› в тему для PreferenceActivity, и цвет флажков и заголовков изменится на белый. - person DiscDev; 07.09.2016
comment
Это уже не так для Android P и его вспомогательных библиотек. Они произвольно становятся серыми. Посмотрю исходник и что-нибудь придумаю - person hoshiKuzu; 19.05.2018

На самом деле только что обнаружил этот текст категории предпочтений, используя colorAccent.

Если ваше приложение не использует стиль colorAccent, вы можете перейти к styles.xml, найти
<item name="colorAccent">@color/colorPrimary</item> и изменить цвет по своему усмотрению.

person Putra Christianto Purba    schedule 07.11.2017
comment
ИМО, это правильный ответ для Lollipop и материального дизайна. Ссылка — grepcode.com/file/repository.grepcode.com/java/ext/ - person Ginandi; 13.12.2017
comment
Спасибо, на самом деле это была моя ошибка. - person Erdnuss; 18.06.2020

В противном случае тема будет упоминаться в вашей AppTheme на уровне приложения.

    <style name="AppBaseTheme" parent="Theme.AppCompat.Light.NoActionBar">
        .....//your other items
        <item name="preferenceTheme">@style/PrefTheme</item>
    </style>

    <style name="PrefTheme" parent="@style/PreferenceThemeOverlay">
        <item name="preferenceCategoryStyle">@style/CategoryStyle</item>
    </style>

    <style name="CategoryStyle" parent="Preference.Category">
        <item name="android:layout">@layout/pref_category_view</item>
    </style>

XML : pref_category_view

<?xml version="1.0" encoding="utf-8"?>
<TextView android:id="@android:id/title"
          style="?android:attr/listSeparatorTextViewStyle"
          xmlns:android="http://schemas.android.com/apk/res/android"
          android:layout_width="match_parent"
          android:textColor="@color/red"
          android:layout_height="wrap_content"
    />

Дополнительные сведения о настройке см. на странице разрешение настроек v7

Важно: я использую PreferenceFragmentCompat из предпочтения lib v7.

person Bharatesh    schedule 13.01.2016
comment
Это самый правильный ответ, охватывающий все уровни API. Просто установка colorAccent не будет работать для API ‹21. Для ленивых, таких как я, есть цвет, определенный в значениях '‹color name=preference_fallback_accent_color›#ff80cbc4‹/color›', который можно переопределить в своих собственных colors.xml. Установка этого параметра вместе с «colorAccent» должна обрабатывать изменение цвета текста во всех API. - person AChez9; 05.04.2018
comment
Я не пробовал это, но, вероятно, это сработает, и я думаю, что это лучший способ. - person Hadi; 27.05.2021

Используя Material Theme, вам просто нужно переопределить следующее свойство:

<style name="YourTheme" parent="@style/Theme.MaterialComponents">
    <item name="colorAccent">@color/your_custom_color</item>
</style>
person avianey    schedule 08.11.2019
comment
Это намного проще! Зачем мне использовать настраиваемый класс, чтобы просто глобально установить цвет заголовка категории? - person August; 15.11.2020

public class MyPreferenceCategory extends PreferenceCategory {

 public MyPreferenceCategory(Context context) {
    super(context);
    // TODO Auto-generated constructor stub
  }
 public MyPreferenceCategory(Context context, AttributeSet attrs) {
    super(context, attrs);
  }
 public MyPreferenceCategory(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    // TODO Auto-generated constructor stub
  }

 @Override
 protected View onCreateView(ViewGroup parent) {
    // It's just a TextView!
 TextView categoryTitle =  (TextView)super.onCreateView(parent);
 categoryTitle.setTextColor(parent.getResources().getColor(R.color.orange));

    return categoryTitle;
  }
}

И в вашем prefs.xml:

<com.your.packagename.MyPreferenceCategory android:title="General">
.
.
.
</com.your.packagename.MyPreferenceCategory>

Или вы также можете использовать этот ответ

person Leebeedev    schedule 26.01.2015
comment
Это отлично сработало для меня с одной модификацией. Вместо categoryTitle.setTextColor(parent.getResources().getColor(R.color.orange)); пришлось использовать categoryTitle.setTextColor(Color.BLACK); - person ckn; 14.11.2015
comment
Это не работает для меня. Я получаю ClassCastException, потому что мой класс Category пытается быть приведен к Preference вместо PreferenceCategory. Есть идеи, почему? - person Marcell; 22.12.2020

Определите свою собственную PreferenceTheme и переопределите цвета.

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
    <item name="preferenceTheme">@style/AppTheme.PreferenceTheme</item>
</style>

<style name="AppTheme.PreferenceTheme" parent="PreferenceThemeOverlay.v14.Material">
    <item name="colorAccent">`#color_value`</item>
</style>
person user10320258    schedule 05.09.2018

Вдохновленный ответом @AliSh, но мне нужно было изменить цвет только одного Preference текстового элемента. Итак, для всех парней из Kotlin:

class TextColorPreference : Preference {

    constructor(context: Context) : super(context)

    constructor(context: Context, attrs: AttributeSet) : super(context, attrs)

    constructor(
        context: Context, attrs: AttributeSet,
        defStyle: Int
    ) : super(context, attrs, defStyle)

    override fun onBindViewHolder(holder: PreferenceViewHolder?) {
        super.onBindViewHolder(holder)

        context?.let {
            (holder?.findViewById(android.R.id.title) as? TextView)?.setTextColor(
                ContextCompat.getColor(
                    it,
                    R.color.colorPrimary
                )
            )
        }
    }
}

А затем поместите это в свой xml/prefs.xml:

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">

    <this.should.be.your.package.TextColorPreference
        android:id="@+id/settings_logout"
        android:key="@string/prefs_key_logout"
        android:title="@string/settings_logout" />
</PreferenceScreen>
person Paul Spiesberger    schedule 25.09.2019

Многие другие ответы не сработали для моего случая. Я использую PreferenceFragmentCompat и не хочу, чтобы это делал реальный код. Поэтому я просто сделал копию XML-файла категории предпочтений и изменил поле textColor. Файл распространяется под лицензией Apache версии 2.

<?xml version="1.0" encoding="utf-8"?>

<!--
  ~ Copyright (C) 2015 The Android Open Source Project
  ~
  ~ Licensed under the Apache License, Version 2.0 (the "License");
  ~ you may not use this file except in compliance with the License.
  ~ You may obtain a copy of the License at
  ~
  ~      http://www.apache.org/licenses/LICENSE-2.0
  ~
  ~ Unless required by applicable law or agreed to in writing, software
  ~ distributed under the License is distributed on an "AS IS" BASIS,
  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  ~ See the License for the specific language governing permissions and
  ~ limitations under the License -->

  <LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginBottom="8dp"
    android:layout_marginTop="8dp"
    android:layout_marginStart="?android:attr/listPreferredItemPaddingLeft"
    android:orientation="vertical">
    <TextView
      android:id="@android:id/title"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:layout_marginTop="16dp"
      android:paddingEnd="?android:attr/listPreferredItemPaddingRight"
      android:textAlignment="viewStart"
      android:textColor="@color/app_accent"
      android:textStyle="bold"
      tools:ignore="RtlSymmetry"/>
    <TextView
      android:id="@android:id/summary"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:ellipsize="end"
      android:singleLine="true"
      android:textColor="?android:attr/textColorSecondary"/>
  </LinearLayout>

И импортировал его в мой макет .xml для фрагмента Preference:

 <PreferenceCategory
    android:layout="@layout/preference_category_companion"
    android:key="my_preference_title"
    android:title="@string/my_preference_title">
person Salladsmannen    schedule 14.01.2019

Для библиотеки настроек androidx вы можете расширить класс PreferenceCategory или Preference следующим образом:

class DangerPreference(
    context: Context?,
    attrs: AttributeSet?,
): Preference(context, attrs) {

    override fun onBindViewHolder(holder: PreferenceViewHolder?) {
        super.onBindViewHolder(holder)
        holder?.itemView?.findViewById<TextView>(android.R.id.title)?.setTextColor(Color.RED)
    }
}

затем используйте его как обычно в своем PreferenceScreen:

<com.github.anastr.myscore.util.pref.DangerPreference
    app:key="deleteServerData"
    app:title="@string/delete_server_data"
    app:iconSpaceReserved="false" />
person Anas Altair    schedule 06.03.2021