Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Custom PreferenceCategory Headings

I have a simple preference screen defined like this

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

I have a style setup already and used elsewhere in my app.

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

and here is my activity

public class PreferencesActivity extends PreferenceActivity implements OnSharedPreferenceChangeListener {     @Override     public void onCreate(Bundle savedInstanceState) {         super.onCreate(savedInstanceState);          addPreferencesFromResource(R.layout.preferences);     } } 

How do I apply my custom style to the PreferenceCategory heading?

like image 764
Josh Avatar asked Jun 09 '11 18:06

Josh


2 Answers

You should take a look at Preference.Category style:

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

Let's take a look at preference_category.xml file:

<!-- 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" /> 

So you need to create custom theme that extends default android Theme and override listSeparatorTextViewStyle value with ListHeader style. And then apply this theme to Activity that extends PreferenceActivity .


Here is how you can do it.

First, in your styles.xml add next code:

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

Then in your AndroidManifest.xml add theme to your preference acitivity:

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

Here is a screenshot:

enter image description here

like image 137
inazaruk Avatar answered Oct 06 '22 03:10

inazaruk


@inazaruk gave the answer well enough but since the recent updates, ADT 18 and above, there are some restrictions on the styles giving the error

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. Since this post doesn't provide a code for understanding i am providing my code here

 <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> 
like image 29
Rohan Kandwal Avatar answered Oct 06 '22 05:10

Rohan Kandwal