28

У меня есть простой экран настроек, определенный как этотПользовательские PreferenceCategory Заголовки

<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 заголовок?

ответ

53

Вы должны взглянуть на 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 стиль. Затем примените эту тему к Activity, которая расширяет 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

+0

я не уверен, как переопределить 'listSeparatorTextViewStyle' – Josh

+0

Я обновить ответ с инструкциями. – inazaruk

+0

Awesome. Это именно то, что я искал. – Josh

19

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

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

See this link for reason of the problem and the solution. Поскольку этот пост не содержит код для понимания я привожу свой код здесь

<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> 
+2

Спасибо за обновление. Я просто столкнулся с этой точной проблемой с уровнем API 19! –

+0

Я не вижу никакой разделительной линии? –

+0

У меня такая же проблема. Я не могу сказать, что это так запутано. больше не видят разделительную линию для категории предпочтений. Как включить это? – NSouth

15

вводя в моду его, как описано в ответ inazaruk является достаточно простым, но это только изменяет стиль текста в заголовке, это Безразлично» t предложить способ указать совершенно новый макет (стиль не будет применяться к элементу 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 при определении макета Preferences.

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

<?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> 
+0

Для меня работает только тот ответ (Target API 21 с AppCompat) – lujop

8

Like Габора, но вместо расширения PreferenceCategory вы можете сделать так: 1. Сделайте свой обычай layout.I назвал его 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> 

Важно: макет должен содержать TextView с этим ID: Android: ID = "@ + андроида: идентификатор/название"

2.And в предпочтении добавить следующую строку: андроид: макет = «@ макет/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> 
Смежные вопросы