J'ai un écran de préférences simple défini comme ceci
<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>
J'ai déjà une configuration de style et je l'utilise ailleurs dans mon application.
<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>
et voici mon activité
public class PreferencesActivity extends PreferenceActivity implements OnSharedPreferenceChangeListener {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.layout.preferences);
}
}
Comment appliquer mon style personnalisé à l'en-tête PreferenceCategory
?
Vous devriez jeter un œil à 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>
Jetons un œil à preference_category.xml
fichier:
<!-- 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"
/>
Vous devez donc créer un thème personnalisé qui étend la valeur par défaut Android Theme
et remplacer la valeur listSeparatorTextViewStyle
par le style ListHeader
. Ensuite, appliquez ce thème à Activité qui étend PreferenceActivity
.
Voici comment vous pouvez le faire.
Premièrement , dans votre styles.xml
ajouter le code suivant:
<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>
Puis dans votre AndroidManifest.xml
ajouter un thème à votre activité préférée:
<activity Android:name=".MyPreferencesActivity"
Android:theme="@style/Theme.Custom"
... >
...
</activity>
Voici une capture d'écran:
@inazaruk a assez bien répondu, mais depuis les dernières mises à jour, ADT 18 and above
, il y a quelques restrictions sur le styles
donnant l'erreur
Error retrieving parent for item: No resource found that matches the given name '@Android:style/Widget.TextView.ListSeparator'.
Voir ce lien pour la raison du problème et la solution . Étant donné que ce message ne fournit pas de code pour la compréhension, je fournis mon code ici
<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>
Le styliser comme décrit dans la réponse d'inazaruk est assez simple mais cela ne change que le style du texte dans l'en-tête, il n'offre pas un moyen de spécifier une toute nouvelle mise en page (le style n'appliquera pas l'élément layout
). Il existe cependant une solution simple si vous étendez la classe:
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);
}
}
et utilisez-le simplement à la place du PreferenceCategory
d'origine lors de la définition de votre disposition Préférences.
Votre mise en page peut, bien sûr, avoir tout ce que vous aimez, y compris des lignes au-dessus ou en dessous du texte, des arrière-plans différents, un remplissage, etc. Par exemple, cela montrera un sous-titre coloré de conception matérielle avec une ligne au-dessus:
<?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>
Comme la réponse de Gábor mais au lieu d'étendre PreferenceCategory, vous pouvez faire comme ceci: 1. Faites votre mise en page personnalisée. Je l'ai nommée 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>
Important: la mise en page doit contenir une vue textuelle avec cet identifiant: Android: id = "@ + Android: id/title"
2. et dans la préférence, ajoutez cette ligne: 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>