Android: Création de préférences personnalisées

Est-il possible de créer une préférence individuelle dans PreferenceScreen ?

Je voudrais coder des paramètres de couleur comme ça:

Préférence de couleur

Je sais que le choix de la couleur est facilement réalisable avec ListPreference , mais ce serait génial avec ce type de "cases à cocher".

    5 Solutions collect form web for “Android: Création de préférences personnalisées”

    La page de développeur Android ne montre que la façon de créer un DialogFragment. Il est toujours possible de personnaliser l'apparence d'un élément de préférence. Dans votre XML, vous devez déclarer l'élément racine comme identifiant: widget_frame, puis déclarer les affichages de texte comme titre et résumé. Vous pouvez ensuite déclarer d'autres éléments que vous souhaitez apparaître dans la mise en page. Voici un exemple montrant un SeekBar que vous pouvez facilement adapter à un sélecteur de couleurs multi-cases.

    Seekbar_preference.xml

     <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@android:id/widget_frame" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <TextView android:id="@android:id/title" style="@android:style/TextAppearance.DeviceDefault.SearchResult.Title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Title" /> <TextView android:id="@android:id/summary" style="@android:style/TextAppearance.DeviceDefault.SearchResult.Subtitle" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Summary" /> <SeekBar android:id="@+id/seekbar" android:layout_width="match_parent" android:layout_height="wrap_content" /> </LinearLayout> 

    Ensuite, dans une classe dérivée de Préférence, annulez la méthode onCreateView:

    SeekbarPreference.java

     @Override protected View onCreateView( ViewGroup parent ) { LayoutInflater li = (LayoutInflater)getContext().getSystemService( Context.LAYOUT_INFLATER_SERVICE ); return li.inflate( R.layout.seekbar_preference, parent, false); } 

    Ensuite, dans le fichier preferences.xml, utilisez la préférence:

    Preferences.xml

     <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" > <com.example.SeekbarPreference android:key="pref_max_volume" android:title="@string/max_volume" /> <com.example.SeekbarPreference android:key="pref_balance" android:title="@string/balance" /> </PreferenceScreen> 

    Cela donne une préférence qui se présente comme suit:

    Article de préférence Seekbar

    Vous pouvez facilement adapter cette méthode pour afficher plusieurs cases à cocher sur une ligne comme dans la question initiale.

    C'est ainsi que je le fais, en utilisant la preference-v7 bibliothèque de support preference-v7 .

    • Extension de la Preference et remplacement onBindViewHolder() . Cette méthode vous permet d'obtenir des références à la vue de votre préférence via l'objet ViewHolder .
    • Infléchissez votre vue personnalisée en utilisant setWidgetLayoutResourece() ou setLayoutResource() dans le constructeur.
    • Désactivez le comportement de clic par défaut de la vue de préférence entière, et permettez seulement que les vues personnalisées à l'intérieur puissent être cliquables.

    préférence

    Layout / preference_theme.xml

     <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="wrap_content"> <Button android:id="@+id/theme_light" ... /> <Button android:id="@+id/theme_dark"... /> <Button android:id="@+id/theme_sepia"... /> <Button android:id="@+id/theme_green"... /> </LinearLayout> 

    PreferenceTheme.java (classe de préférence personnalisée)

     import android.support.v7.preference.Preference; import android.support.v7.preference.PreferenceViewHolder; public class PreferenceTheme extends Preference { public PreferenceTheme(Context context, AttributeSet attrs) { this(context, attrs, 0); } public PreferenceTheme(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); setWidgetLayoutResource(R.layout.preference_theme); } @Override public void onBindViewHolder(PreferenceViewHolder holder) { super.onBindViewHolder(holder); holder.itemView.setClickable(false); // disable parent click View button = holder.findViewById(R.id.theme_dark); button.setClickable(true); // enable custom view click button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // persist your value here } }); // the rest of the click binding } } 

    Preferences.xml

     <?xml version="1.0" encoding="utf-8"?> <android.support.v7.preference.PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.v7.preference.PreferenceCategory android:title="Reading"> <example.com.preference.PreferenceTheme android:key="pref_theme" android:title="Theme" android:defaultValue="light" /> ... </android.support.v7.preference.PreferenceCategory> </android.support.v7.preference.PreferenceScreen> 

    La création d'une préférence personnalisée est similaire à la création d'un fragment ou d'autres composants UI, en définissant des vues et des actions.

    Les développeurs Android ont un bon guide sur la création de paramètres, qui comprend une section pour créer des préférences personnalisées: http://developer.android.com/guide/topics/ui/settings.html#Custom

    Vous pouvez créer votre mise en page personnalisée de préférence et vous pouvez l'configurer dans android:layout attribut de android:layout en android:layout dans Preference en res / xml comme ceci:

     <Preference ...................... android:layout="@layout/your_layout" /> 

    Ou vous pouvez utiliser une activité au lieu de la préférence

    Ou une meilleure alternative sera d'étendre la classe DialogPreference. Vous pouvez configurer un widget de sélection de couleur comme vue de dialogue et obtenir le résultat positif dans la préférence étendue elle-même. Voici une question similaire, mais c'est très utile pour votre scénario.

    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.