Пользовательские заголовки PreferenceCategory - PullRequest
30 голосов
/ 09 июня 2011

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

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
    <PreferenceCategory android:title="Security">
        <CheckBoxPreference 
            android:title="Require Pin on Start"
            android:summary="Require pin to run the application"
            android:key="@string/pref_require_pin"
            android:defaultValue="false" />
    </PreferenceCategory>

    <PreferenceCategory android:title="Settings">
        <ListPreference
           android:title="History Age (in days)"
           android:summary="Display items up to 30 days old"
           android:key="@string/pref_history_days"
           android:defaultValue="30"
           android:entries="@array/days_list"
           android:entryValues="@array/days_list"
           android:dialogTitle="Select History Age"/>
    </PreferenceCategory>
</PreferenceScreen>

У меня уже есть настройка стиля, которая используется в другом месте моего приложения.

<style name="ListHeader">
    <item name="android:textColor">#000000</item>
    <item name="android:textStyle">bold</item>
    <item name="android:textSize">12sp</item>
    <item name="android:background">#cccccc</item>
    <item name="android:paddingTop">6px</item>
    <item name="android:paddingBottom">6px</item>
    <item name="android:paddingLeft">12px</item>
</style>

, и вот моя активность

public class PreferencesActivity extends PreferenceActivity implements OnSharedPreferenceChangeListener {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        addPreferencesFromResource(R.layout.preferences);
    }
}

Как применить мой собственный стиль к заголовку PreferenceCategory?

Ответы [ 4 ]

57 голосов
/ 09 июня 2011

Вы должны взглянуть на Preference.Category стиль:

<style name="Preference.Category">
    <item name="android:layout">@android:layout/preference_category</item>
   <item name="android:shouldDisableView">false</item>
   <item name="android:selectable">false</item>
</style>

Давайте посмотрим на preference_category.xml файл:

<!-- Layout used for PreferenceCategory in a PreferenceActivity. -->
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    style="?android:attr/listSeparatorTextViewStyle"
    android:id="@+android:id/title"
/>

Таким образом, вам нужно создать собственную тему, которая расширяет андроид Theme по умолчанию и переопределяет значение listSeparatorTextViewStyle с помощью стиля ListHeader. И затем примените эту тему к Деятельности, которая расширяет PreferenceActivity.


Вот как вы можете это сделать.

Сначала , в вашем styles.xml добавьте следующий код:

<style name="PreferenceListHeader" 
       parent="@android:style/Widget.TextView.ListSeparator">

    <item name="android:textColor">#000000</item>
    <item name="android:textStyle">bold</item>
    <item name="android:textSize">12sp</item>
    <item name="android:background">#cccccc</item>
    <item name="android:paddingTop">6px</item>
    <item name="android:paddingBottom">6px</item>
    <item name="android:paddingLeft">12px</item>
</style>

<style name="Theme.Custom" parent="@android:style/Theme">
    <item name="android:listSeparatorTextViewStyle">@style/PreferenceListHeader</item>               
</style>

Затем в вашей AndroidManifest.xml добавьте тему к своей предпочтительности:

 <activity android:name=".MyPreferencesActivity" 
           android:theme="@style/Theme.Custom" 
           ... >
 ...
 </activity>

Вот скриншот:

enter image description here

20 голосов
/ 07 октября 2013

@ inazaruk дал ответ достаточно хорошо, но с момента последних обновлений ADT 18 and above существуют некоторые ограничения на styles, выдающие ошибку

Error retrieving parent for item: No resource found that matches the given name '@android:style/Widget.TextView.ListSeparator'.

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

 <style name="Widget.TextView.ListSeparator" parent="@android:style/Widget.TextView">
    <item name="android:layout_width">match_parent</item>
    <item name="android:layout_height">wrap_content</item>
    <item name="android:textStyle">bold</item>
    <item name="android:textSize">14sp</item>
    <item name="android:gravity">center_vertical</item>
</style>

<style name="PreferenceListHeader" parent="Widget.TextView.ListSeparator">
    <item name="android:textColor">#000000</item>
    <item name="android:textStyle">bold</item>
    <item name="android:textSize">18sp</item>
    <item name="android:background">#cccccc</item>
    <item name="android:paddingTop">6dp</item>
    <item name="android:paddingBottom">6dp</item>
    <item name="android:paddingLeft">12dp</item>
</style>

<style name="PreferenceScreen" parent="android:Theme.NoTitleBar">
    <item name="android:listSeparatorTextViewStyle">@style/PreferenceListHeader</item>
    <item name="android:background">#F2B1DBF3</item>
</style>
15 голосов
/ 21 января 2015

Оформить его так, как описано в ответе Иназарука, достаточно просто, но он только меняет стиль текста в заголовке, он не предлагает способ указать совершенно новый макет (стиль не будет применять элемент layout).Однако существует простое решение, если вы расширяете класс:

public class MyPreferenceCategory extends PreferenceCategory {

  public MyPreferenceCategory(Context context) {
    super(context);
    setLayoutResource(R.layout.yourlayout);
  }

  public MyPreferenceCategory(Context context, AttributeSet attrs) {
    super(context, attrs);
    setLayoutResource(R.layout.yourlayout);
  }
}

и просто используете его вместо исходного PreferenceCategory при определении макета настроек.

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

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical" >
    <View
        android:layout_width="match_parent"
        android:layout_height="1dp"
        android:layout_marginTop="6dp"
        android:background="?attr/divider_color" />
    <TextView
        android:id="@+android:id/title"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center_vertical"
        android:padding="12dp"
        android:textColor="?attr/colorAccent"
        android:textSize="14sp"
        android:textStyle="bold" />
</LinearLayout>
10 голосов
/ 24 июня 2016

Как и ответ Габора, но вместо расширения PreferenceCategory вы можете сделать это следующим образом: 1. Создайте свой собственный макет. Я назвал его preference_category.xml :

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
<View
    android:layout_width="match_parent"
    android:layout_height="1dp"
    android:layout_marginTop="6dp"
    android:background="?attr/divider_color" />
<TextView
    android:id="@+android:id/title"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:gravity="center_vertical"
    android:padding="12dp"
    android:textColor="?attr/colorAccent"
    android:textSize="14sp"
    android:textStyle="bold" />
</LinearLayout>

Важно: макет должен содержать текстовое представление с таким идентификатором: android: id = "@ + android: id / title"

2. и в настройках добавить эту строку: android: layout = "@ layout/ preference_category "

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

<PreferenceCategory
    android:key="Font_Settings"
    android:title="@string/UISetting"
    android:layout="@layout/preference_category" >
... //  other preferences in the category
</PreferenceCategory>
</PreferenceScreen>
...