Цвет текста фрагмента предпочтений Android

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

styles.xml

<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android">
    <style name="selectedTextStyle">  
        <item name="android:textSize">18sp</item>
    </style>
    <style name="buttonTextStyle">  
        <item name="android:textSize">20sp</item>
    </style>
    <style name="PreferencesTheme" >
        <item name="android:windowBackground">@drawable/lists_background</item>
        <item name="android:listViewStyle">@style/listViewPrefs</item>
        <item name="android:checkboxStyle">@style/MyCheckbox</item>

    </style>
    <style name="MyTextAppearance" parent="@android:style/TextAppearance">
        <item name="android:textColor">@color/black</item>
      </style>
    <style name="listViewPrefs" parent="@android:Widget.ListView">
        <item name="android:listSelector">@layout/list_selector_master</item>
        <item name="android:textAppearance">@style/MyTextAppearance</item>
    </style>
    <style name="MyCheckbox" parent="android:Widget.CompoundButton.CheckBox">
        <item name="android:button">@drawable/btn_check</item>
    </style>

</resources>

Манифест:

        <activity
            android:name="com.package.SettingsActivity"
            android:theme="@style/PreferencesTheme"
            android:configChanges="keyboard|orientation" >
        </activity>

Деятельность:

import android.app.Activity;
import android.os.Bundle;
import android.preference.PreferenceFragment;

public class SettingsActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // Display the fragment as the main content.
        getFragmentManager().beginTransaction()
                .replace(android.R.id.content, new SettingsFragment())
                .commit();

    }
    public static class SettingsFragment extends PreferenceFragment {
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);

            // Load the preferences from an XML resource
            addPreferencesFromResource(R.xml.preferences);

        }
    }

}

person AlexIIP    schedule 01.02.2013    source источник


Ответы (8)


Вот два TextView объекта из preference.xml (макет для Preference):

    <TextView android:id="@+android:id/title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:singleLine="true"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:ellipsize="marquee"
        android:fadingEdge="horizontal" />

    <TextView android:id="@+android:id/summary"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@android:id/title"
        android:layout_alignLeft="@android:id/title"
        android:textAppearance="?android:attr/textAppearanceSmall"
        android:textColor="?android:attr/textColorSecondary"
        android:maxLines="4" />

Похоже, вы можете переопределить textAppearanceLarge и textColorSecondary в своей теме, чтобы добиться изменения цвета. Вот пример:

<style name="AppTheme">
    <item name="android:textAppearanceLarge">@style/MyTextAppearance</item>
    <item name="android:checkboxStyle">@style/MyCheckBox</item>
</style>

<style name="MyCheckBox" parent="@android:style/Widget.CompoundButton.CheckBox">
    <item name="android:button">@android:drawable/btn_star</item>
</style>

<style name="MyTextAppearance" parent="@android:style/TextAppearance.Large">
    <item name="android:textColor">#ff0000</item>
</style>
person Jason Robinson    schedule 01.02.2013
comment
Я думаю, что это все. Не могли бы вы помочь мне в этом, <item name="android:textAppearanceLarge">@style/MyTextAppearance</item> похоже, не помогло. - person AlexIIP; 01.02.2013
comment
@AlexIIP Вы разместили это в стиле PreferenceTheme? - person Jason Robinson; 01.02.2013
comment
Да, я это сделал, приведенная выше строка взята из PreferenceTheme и, как вы можете видеть, MyTextAppearance имеет textColor. Стоит ли поменять его на что-нибудь другое? - person AlexIIP; 01.02.2013
comment
@AlexIIP Разве по умолчанию не черный цвет? Попробуйте другой цвет. - person Jason Robinson; 01.02.2013
comment
Нет, цвет светло-серый, и он конфликтует с моим фоном, я почти не вижу текст. - person AlexIIP; 01.02.2013
comment
@AlexIIP Проверьте мою правку. Я только что создал новое приложение, чтобы проверить это, и оно у меня сработало. - person Jason Robinson; 01.02.2013
comment
Прежде всего спасибо! Во-вторых, я пытаюсь воспроизвести это и не могу. Если я установил PreferenceTheme на android:Theme.Light, это изменит текст на черный, но затем избавится от моего настраиваемого флажка и селектора представления списка. Если я не включу родительскую тему, ничего не произойдет. (Я считаю, что цвет по умолчанию для Theme Light - черный). - person AlexIIP; 01.02.2013
comment
Попробуйте установить родительскую тему на android:Theme.Black - person Jason Robinson; 01.02.2013
comment
Хорошо, опять же, это меняет цвет моего текста, но из-за этого моя панель действий выглядит старой и переопределяет цвета моего селектора listView. По умолчанию используется уродливый желтый селектор. - person AlexIIP; 01.02.2013
comment
Это немного сложно, потому что изначально вы не определили родительскую тему для своей настраиваемой темы, поэтому я не уверен, откуда она наследует свои значения. Не зная этого, я не знаю, где искать, какой стиль нужно изменить. - person Jason Robinson; 01.02.2013
comment
Могу ли я выбрать Theme.Light, а затем таким образом переопределить селектор и переопределить строку заголовка на системное значение по умолчанию? Вы бы знали, как это сделать? - person AlexIIP; 01.02.2013
comment
Я удалил родительский элемент из своей темы, и все по-прежнему работает нормально. Я даже изменил флажок по умолчанию точно так же, как и вы. Так что это должно работать. Я снова отредактирую свой ответ, указав, как теперь выглядит моя тема. - person Jason Robinson; 01.02.2013
comment
Я все еще не могу заставить его работать. Я удалил фон, чтобы попробовать, но все равно ничего. Я обновляю свой оригинал с помощью своего SettingsActivity, который использует PreferenceFragment, может ли это быть проблемой? - person AlexIIP; 01.02.2013
comment
Мне кажется, это нормально. Я не уверен, почему это не сработает для вас, но работает для меня. Не знаю, что еще предложить. Извиняюсь :( - person Jason Robinson; 01.02.2013
comment
Большое вам спасибо за ваше время. Если никто больше не ответит, я дам вам ответ в кредитах. - person AlexIIP; 01.02.2013
comment
В итоге мне пришлось переопределить android:textAppearanceMedium, чтобы изменить цвет текста заголовка предпочтения. Я не понимаю, почему это сработало, а не android:textAppearanceLarge. - person mharper; 20.10.2013
comment
Макет предпочтений holo, preference_holo.xml, использует textAppearance.Medium. - person dgmltn; 20.12.2014

Я думаю, что простой и понятный способ сделать это следующий:

res / values ​​/ styles.xml

<style name="SettingsFragmentStyle">

    <item name="android:textColorSecondary">#222</item>
    <item name="android:textColor">#CCC</item>
    <item name="android:background">#999</item>
    ...
</style>

В Activity, который содержит подкласс PreferenceFragment внутри onCreate:

setTheme(R.style.SettingsFragmentStyle);
person Andrew    schedule 16.04.2015
comment
Для меня это был textColorSecondarytextColorPrimary), который заставил его работать. Спасибо, что поделился! - person dustinrwh; 15.12.2016

Только что нашел ответ, который выполняет свою работу.

Этот файл является макетом по умолчанию для элемента списка предпочтений:

<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2006 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.
-->

<!-- Layout for a Preference in a PreferenceActivity. The
     Preference is able to place a specific widget for its particular
     type in the "widget_frame" layout. -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:minHeight="?android:attr/listPreferredItemHeight"
    android:gravity="center_vertical"
    android:paddingRight="?android:attr/scrollbarSize"
    android:background="?android:attr/selectableItemBackground" >

    <ImageView
        android:id="@+android:id/icon"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        />

    <RelativeLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="15dip"
        android:layout_marginRight="6dip"
        android:layout_marginTop="6dip"
        android:layout_marginBottom="6dip"
        android:layout_weight="1">

        <TextView android:id="@+android:id/title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:singleLine="true"
            android:textAppearance="?android:attr/textAppearanceLarge"
            android:ellipsize="marquee"
            android:fadingEdge="horizontal" />

        <TextView android:id="@+android:id/summary"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@android:id/title"
            android:layout_alignLeft="@android:id/title"
            android:textAppearance="?android:attr/textAppearanceSmall"
            android:textColor="?android:attr/textColorSecondary"
            android:maxLines="4" />

    </RelativeLayout>

    <!-- Preference should place its actual preference widget here. -->
    <LinearLayout android:id="@+android:id/widget_frame"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:gravity="center_vertical"
        android:orientation="vertical" />

</LinearLayout>

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

<Preference android:key="somekey" 
android:title="Title" 
android:summary="Summary" 
android:layout="@layout/custom_preference_layout"/>

Вы можете изменить весь макет вне списка, вам просто нужно иметь файл макета, содержащий представление списка, в котором настройки будут заполнены следующим образом:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Something" />

    <ListView
        android:id="@android:id/list"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" />

</LinearLayout>

Чтобы переопределить макет по умолчанию для PreferenceFragment, переопределите метод onCreateView и измените расширенное представление:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    return inflater.inflate(R.layout.custom_options_layout, null);
}

Основываясь на этих ответах:

Создание настраиваемого макета для настроек

Как добавить кнопку на PreferenceScreen

Android: как настроить поля / отступы в предпочтениях?

person Saito Mea    schedule 17.07.2013
comment
Поскольку я не могу пометить свой ответ как правильный для награды, я все еще принимаю ответы, которые достигают того же, используя только темы (что похоже на то, что хотел исходный плакат). - person Saito Mea; 18.07.2013

Для меня ничего из вышеперечисленных методов не сработало. В итоге я расширил класс Prefernces того типа, который использовал, в моем случае CheckBoxPrefernces:

 public class MyPreferenceCheckBox extends CheckBoxPreference {

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

    @Override
    protected View onCreateView(ViewGroup parent) {
        ViewGroup root = (ViewGroup) super.onCreateView(parent);
        ((TextView)root.findViewById(android.R.id.title)).setTextColor(parent.getResources().getColor(R.color.red));
        ((TextView)root.findViewById(android.R.id.summary)).setTextColor(parent.getResources().getColor(R.color.red));
        return root;
    }
}

И использование в prefs.xml:

 <com.my.package.name.MyPreferenceCheckBox
        android:title="@string/my_title"
        android:defaultValue="true"
        android:key="@string/my_key"
        android:summary="On/Off" />

Этот ответ показал мне этот путь:

person yshahak    schedule 17.08.2015

У меня недостаточно репутации, чтобы прокомментировать или проголосовать, но я просто хотел добавить, что предложение mharper о TextAppearanceMedium также сработало для меня в отношении изменения цвета текста. Если кто-то знает, почему это так, пожалуйста, объясните это.

Так что просто измените принятый ответ следующим образом:

<style name="AppTheme">
     <item name="android:textAppearanceMedium">@style/MyTextAppearance</item>
</style>

<style name="MyTextAppearance" parent="@android:style/TextAppearance.Medium">
     <item name="android:textColor">#ff0000</item>
</style>

По крайней мере, если никто не сможет объяснить, почему это так, это может помешать кому-то столкнуться с теми же трудностями, что и я, пытаясь изменить цвет текста.

person Woodstown    schedule 30.04.2014
comment
В ваших предпочтениях, вероятно, используется preference_holo.xml, а не preference.xml. В голографической версии используется textAppearance.Medium. - person dgmltn; 20.12.2014

Мне удалось изменить цвет текста в PreferenceFragment следующим образом:

styles.xml

<resources>

    <style name="SettingsTheme" parent="android:Theme.Holo">
        <item name="android:textColorPrimary">@color/light_blue_font_color</item>
        <item name="android:textColorSecondary">@color/white_font_color</item>
        <item name="android:textColorTertiary">@color/white_font_color</item>
    </style>

</resources>

colors.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="light_blue_font_color">#33b5e5 </color>
    <color name="white_font_color">#ffffff </color>
</resources>

AndroidManifest.xml

<activity
    android:name="xx.yy.zz.SettingsActivity"
    android:theme="@style/SettingsTheme" >
</activity>
person Paulo Matuki    schedule 07.07.2014

Если вы используете библиотеку совместимости, просто добавьте:

<item name="colorAccent">#ff0000</item>

к твоему стилю

person Oded Breiner    schedule 25.01.2015

Я работаю с min API 11 и компилирую с 23 установкой темы и после установки фона для этой темы. если вы работаете с> API 14, вы можете использовать Theme_DeviceDefault.

Это самое простое решение, которое я нашел:

public static class SettingsFragment extends PreferenceFragment {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        getActivity().setTheme(android.R.style.Theme_Holo);
        // Load the preferences from an XML resource
        addPreferencesFromResource(R.xml.settings);
    }

    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        if(view != null){
            view.setBackgroundColor(ContextCompat.getColor(getActivity(), android.R.color.background_dark));
        }
    }
}
person Sinelc    schedule 16.06.2016
comment
Осторожно с этим, просто сбросьте всю тему на активность. Это означает, что когда вы показываете другой фрагмент, он будет иметь ту же тему. - person lostintranslation; 26.01.2017