Preferencias personalizadasCategorías

Tengo una pantalla de preferencias simple definida como esta

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

Ya tengo una configuración de estilo y la utilizo en otra parte de mi aplicación.

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

Y aquí está mi actividad

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

¿Cómo puedo aplicar mi estilo personalizado al encabezado PreferenceCategory ?

Usted debe echar un vistazo a Preference.Category estilo:

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

Echemos un vistazo al archivo 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" /> 

Por lo tanto, necesita crear un tema personalizado que extienda el tema predeterminado de Android y sustituya el valor de ListHeader con el estilo de ListHeader . A continuación, aplique este tema a Actividad que amplíe PreferenceActivity .


Aquí sabrás como podrás hacerlo.

Primero , en tu styles.xml agrega el siguiente código:

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

A continuación, en su AndroidManifest.xml añadir tema a su preferencia acitivity:

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

Aquí hay una captura de pantalla:

Introduzca aquí la descripción de la imagen

@inazaruk dio la respuesta bastante bien, pero desde las últimas actualizaciones, ADT 18 and above , hay algunas restricciones sobre los styles dan el error

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

Vea este enlace por la razón del problema y la solución . Dado que este post no proporciona un código para la comprensión estoy proporcionando mi código aquí

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

Estilizarlo como se describe en la respuesta de inazaruk es bastante simple, pero sólo cambia el estilo del texto en el encabezado, no ofrece una manera de especificar un nuevo diseño completo (el estilo no aplicará el elemento de layout ). Sin embargo, hay una solución sencilla si amplía la clase:

 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); } } 

Y simplemente use esto en lugar de la categoría de PreferenceCategory original al definir su diseño de preferencias.

Su diseño puede, por supuesto, tener lo que quiera, incluyendo líneas por encima o por debajo del texto, fondos diferentes, relleno, lo que sea. Por ejemplo, esto mostrará un subtítulo de color de diseño de material con una línea arriba:

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

Al igual que la respuesta de Gábor, pero en lugar de extender la categoría de preferencias, puedes hacer lo siguiente: 1. Haz tu diseño personalizado. Lo nombré preferencia_categoría.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> 

Importante: el diseño debe contener una vista de texto con este identificador: android: id = "@ + android: id / title"

2.y en la preferencia agregue esta línea: 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> 
  • Compatibilidad para SwitchPreference (pre ICS)?
  • ¿Cómo detectar si se hicieron cambios en las preferencias?
  • color de fondo de la categoría de preferencia de Android
  • ¿PreferenceFragment con el fondo transparente?
  • ¿Hay una manera de mantener los divisores alrededor de una preferencia no seleccionable?
  • EditTextPreference hace que Inflate Exception
  • Inicio de Configuración Actividad de Preferencias XML funciona en 2.x pero no en 4.x
  • Respondiendo a las actualizaciones de preferencias en Android
  • NullPointerException en android.widget.ArrayAdapter.createViewFromResource
  • Uso de findviewbyid en preferenciaactividad
  • Preferencias sin métodos obsoletos
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.