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

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

Je voudrais coder les parameters de couleur comme ça:

Préférence de couleur

Je sais que choisir la couleur est facilement réalisable avec ListPreference , mais ce serait génial avec ce genre de “cases à cocher”.

    La page Développeur Android montre uniquement comment créer un DialogFragment . Il est néanmoins possible de personnaliser l’apparence d’un élément de Preference . Dans votre XML, vous devez déclarer l’élément racine comme android:id="@android:id/widget_frame , puis déclarer TextView comme android:title et android:summary . Vous pouvez ensuite déclarer d’autres éléments que vous souhaitez voir apparaître dans la mise en page. Voici un exemple montrant un SeekBar que vous pouvez facilement adapter à un sélecteur de couleurs à plusieurs cases.

    seekbar_preference.xml

          

    Ensuite, dans une classe dérivant de Preference , remplacez 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

         

    Cela donne une préférence qui ressemble à ceci:

    Objet de préférence Seekbar

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

    Voici comment je le fais, en utilisant la bibliothèque de support preference-v7 .

    • Étendre les Preference et remplacer onBindViewHolder() . Cette méthode vous permet d’obtenir des références à la vue de vos préférences via l’object ViewHolder .
    • Gonflez votre vue personnalisée en utilisant setWidgetLayoutResourece() ou setLayoutResource() dans constructeur.
    • Désactivez le comportement de clic par défaut de la vue de préférence entière et autorisez uniquement les vues personnalisées à l’intérieur de celle-ci à être cliquable.

    préférence

    layout / preference_theme.xml

            

    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, AtsortingbuteSet attrs) { this(context, attrs, 0); } public PreferenceTheme(Context context, AtsortingbuteSet 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

         ...   

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

    Les développeurs Android ont un bon guide sur la création de parameters, 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 la définir dans android:layout atsortingbut android:layout dans Preference in res / xml comme ceci:

      

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

    Ou une meilleure alternative sera d’étendre la classe DialogPreference. Vous pouvez définir un widget de sélecteur de couleur en tant que vue de dialog et obtenir le résultat positif dans la préférence étendue elle-même. Voici une question similaire, mais elle est très utile pour votre scénario.