web-dev-qa-db-fra.com

Comment gérer les diviseurs dans un PreferenceFragment?

J'ai commencé à gérer les préférences dans une PreferenceFragment. Voici ce que j'ai

my_preferences

J'essaye de:

  1. se débarrasser des séparations entre les articles. Je suppose que cela peut être défini à partir de styles, mais je ne peux pas comprendre comment. J'ai essayé d'obtenir la préférence ListView lors de l'appel de l'exécution findViewById(Android.R.id.list), comme je l'ai lu quelque part, mais elle renvoie null.

  2. set new, pleine largeur séparateurs situés juste au-dessus des en-têtes, comme indiqué ici . Par exemple, dans ce cas, je veux un séparateur pleine largeur juste au-dessus de "Statistiche", mais pas au-dessus de "Generali", qui se trouve en haut de la liste.

La seule façon qui me vienne à l’esprit est de définir des séparations comme fausses préférences, comme avec:

<Preference
    Android:layout="@layout/divider" //here I set width and a divider resource
    />

<PreferenceCategory ... />

Le problème principal ici est que ma PreferenceFragment (ou la ActionBarActivity elle est en place) a un remplissage gauche/droite qui rend tout séparateur que j’ajoute dans preferences.xml not couvre toute la largeur.

Donc ma question est:

  • Comment puis-je me débarrasser des diviseurs d'article par article que vous pouvez voir dans l'image?

  • Comment définir des séparations sur toute la largeur, juste au-dessus des en-têtes, ou comment supprimer le remplissage interne des fragments/activités? Bien sûr, ma mise en page d'activité n'a pas de remplissage (explicite).

12
natario

Avait totalement oublié cette question, va poster une réponse maintenant pour aider les autres. J'ai résolu en déplaçant mon code dans la méthode onResume() de l'activité qui héberge ma PreferenceFragment. Je pense qu'il y a plusieurs autres points sur lesquels vous pouvez rappeler une ListView non nulle à l'aide de findViewById(Android.R.id.list).

public boolean mListStyled;

@Override
public void onResume() {
    super.onResume();
    if (!mListStyled) {
        View rootView = getView();
        if (rootView != null) {
            ListView list = (ListView) rootView.findViewById(Android.R.id.list);
            list.setPadding(0, 0, 0, 0);
            list.setDivider(null);
            //any other styling call
            mListStyled = true;
        }
    }
}

Vous pouvez probablement vous débarrasser de la vérification rootView, mais vous voudrez peut-être même vérifier list != null. De toute façon, je n’ai fait face à aucun NPE de cette façon.

Donc, setDivider(null) enlève les diviseurs article-article. J'ai réussi à ajouter des séparateurs de section couvrant toute la largeur de l'écran en:

  • Suppression du remplissage de list;
  • Ajouter une préférence personnalisée dans mon XML:

n

 <Preference
     Android:title="divider"
     Android:selectable="false"
     Android:layout="@layout/preference_divider"/>
8
natario

Ajoutez ce code sous la PreferenceFragment:

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

        // remove dividers
        View rootView = getView();
        ListView list = (ListView) rootView.findViewById(Android.R.id.list);
        list.setDivider(null);

    }
22
SagiLow

Bien que je sois un peu en retard, j’ai eu les mêmes problèmes avec les diviseurs dans l’écran preff et j’ai trouvé cette solution: Définissez un style personnalisé pour l’activité hébergement et ajoutez-y le style:

   <item name="Android:listDivider">@null</item>

En fait, il fait la même chose que de le définir par le code, mais vous enregistrez un findById et je pense que cela semble plus clair.

10
X3Btel

Pour PreferenceFragmentCompat, ListView ne fonctionne pas. Mais cela fonctionne comme un charme:

<style name="PrefsTheme" parent="PreferenceThemeOverlay.v14.Material">
    <item name="Android:divider">@null</item>
    <item name="Android:dividerHeight">0dp</item>
</style>

Ajoutez ceci à votre thème d'application:

<item name="preferenceTheme">@style/PrefsTheme</item>
4
formatBCE

J'avais exactement ce problème et je voulais des divisions entre les catégories de préférences mais pas entre les articles eux-mêmes. J'ai trouvé que la solution acceptée répondait à la question 1 en supprimant les séparateurs des éléments de préférence, mais ne fixait pas la question 2 et ajoutait les séparateurs entre les catégories de préférence.

Correction ci-dessous. Remplacez en gros la méthode onCreateAdapter de votre PreferenceFragmentCompat et donnez-lui un PreferenceGroupAdapter personnalisé qui possède une méthode onBindViewHolder surchargée qui utilise la position et tout ce que vous devez définir pour chaque détenteur de vue. Un séparateur sera tracé lorsque les deux utilisateurs permettent un séparateur entre eux.

Voici ma solution 

public class SettingsFragment extends PreferenceFragmentCompat {

    @Override
    protected RecyclerView.Adapter onCreateAdapter(PreferenceScreen preferenceScreen) {
        return new CustomPreferenceGroupAdapter(preferenceScreen);
    }

    static class CustomPreferenceGroupAdapter extends PreferenceGroupAdapter {

    @SuppressLint("RestrictedApi")
    public CustomPreferenceGroupAdapter(PreferenceGroup preferenceGroup) {
        super(preferenceGroup);
    }

    @SuppressLint("RestrictedApi")
    @Override
    public void onBindViewHolder(PreferenceViewHolder holder, int position) {
        super.onBindViewHolder(holder, position);
        Preference currentPreference = getItem(position);
        //For a preference category we want the divider shown above.
        if(position != 0 && currentPreference instanceof PreferenceCategory) {
            holder.setDividerAllowedAbove(true);
            holder.setDividerAllowedBelow(false);
        } else {
            //For other dividers we do not want to show divider above 
            //but allow dividers below for CategoryPreference dividers.
            holder.setDividerAllowedAbove(false);
            holder.setDividerAllowedBelow(true);
        }
    }
}
1
doubleA

Vous pouvez redessiner votre diviseur en utilisant ce thème.

<style name="PreferenceFragment.Material">
    <item name="Android:divider">@drawable/preference_list_divider_material</item>
</style>
0
The Finest Artist

Nouvelle solution pour la nouvelle API Android 24 et supérieures ( 25 décembre 2017 ).

J'ai trouvé après plusieurs tentatives sur stackoverflow, mais cela ne fonctionne pas, ou simplement, mais ne fonctionne pas dans nestest PreferenceScreen.

Tout d'abord, vous devez rechercher listview à partir du fragment en cours d'affichage et supprimer le séparateur:

private fun removeDividerInCurrentFragment() {
    [email protected](Android.R.id.content)?.let {
        it.view?.findViewById<ListView?>(Android.R.id.list)?.let {
            it.divider = null
            it.dividerHeight = 0
        }
    }
}

Deuxièmement, pour supprimer le diviseur lorsque le fragment est validé, appelez la méthode ci-dessus (removeDividerInCurrentFragment) pour supprimer le diviseur de listview.

Bien sûr, si vous avez nestest PreferenceScreen. Enregistrez le programme d'écoute lorsque le fragment a été modifié dans votre PreferenceActivity par le protocole implémenter FragmentManager.OnBackStackChangedListener:

class YourPreferenceActivity : PreferenceActivity(), FragmentManager.OnBackStackChangedListener {
    override fun onBackStackChanged() {
        [email protected]()
    }
}

Enfin, enregistrez les modifications de backstack auditeur par l'appel fragmentManager.addOnBackStackChangedListener(this@ YourPreferenceActivity) dans onCreate. Et enlevez les écouteurs de modifications de pile en appelant fragmentManager.removeOnBackStackChangedListener dans la méthode onDestroyed.

Bonne chance!

0
dphans

si vous utilisez un PreferenceFragment, vous pouvez utiliser ListView .setDivider(null); si vous utilisez un PreferenceFragmentCompat, vous pouvez utiliser PreferenceFragmentCompat .setDivider(Drawable divider) ou setDividerHeight(int height);

0
sadmonster