studio example developer addpreferencesfromresource activity android android-layout android-preferences preferenceactivity

android - example - Encabezados de categoría de preferencias personalizadas



preference screen android studio (4)

@inazaruk dio la respuesta lo suficientemente bien pero desde las actualizaciones recientes, 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 el motivo del problema y la solución . Como esta publicación no proporciona un código para entender, proporciono 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>

Tengo una pantalla de preferencias simples definida así

<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 otro lugar 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 aplico mi estilo personalizado al encabezado PreferenceCategory ?


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

Importante: el diseño debe contener una vista de texto con esta identificación: android: id = "@ + android: id / title"

2.y en la preferencia agrega 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>


Deberías echarle un vistazo al estilo 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>

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, debe crear un tema personalizado que amplíe el Theme android predeterminado y anule el valor ListHeader con el estilo ListHeader . Y luego aplique este tema a la Actividad que amplía PreferenceActivity .

Aquí sabrás como podrás hacerlo.

Primero , en su styles.xml agregue 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>

Luego, en su AndroidManifest.xml agregue el tema a su actividad preferida:

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

Aquí hay una captura de pantalla:


Diseñarlo como se describe en la respuesta de inazaruk es bastante simple, pero solo cambia el estilo del texto en el encabezado, no ofrece una manera de especificar un diseño completamente nuevo (el estilo no aplicará el elemento de layout ). Sin embargo, hay una solución directa si extiende 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 PreferenceCategory original al definir su diseño de Preferencias.

Su diseño puede, por supuesto, tener todo lo que desee, incluidas las líneas encima o debajo del texto, diferentes fondos, relleno, lo que sea. Por ejemplo, esto mostrará un subtítulo 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>