Wie verwalten Teiler in einem PreferenceFragment?

Ich begann den Umgang mit Präferenzen in eine PreferenceFragment. Hier ist, was ich habe:

my_preferences

Ich versuche an:

  1. loszuwerden, die Trennwände zwischen den Elementen. Ich nehme an, diese können definiert werden, von styles, aber ich kann nicht herausfinden, wie. Ich versuchte, den Vorliebe ListView zur Laufzeit aufrufen findViewById(android.R.id.list), wie ich es irgendwo gelesen, aber es gibt null zurück.

  2. neue, in voller Breite Trennwände, rechts oben die überschriften, wie man Sie hier. Zum Beispiel in diesem Fall möchte ich eine volle Breite-Teiler rechts oben "Statistiche", aber nicht über "Generali", die oben auf der Liste.

Die einzige Möglichkeit, die mir in den Sinn kommt ist die Einstellung Teiler als fake Vorlieben, wie mit:

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

<PreferenceCategory ... />

Das Hauptproblem hier ist, dass mein PreferenceFragment (oder ActionBarActivity es) hat einige Links - /rechts-Polsterung, die eine Trennlinie, die ich in preferences.xml nicht decken die gesamte Breite.

Also meine Frage sind:

  • Wie kann ich loswerden der Standard -, Element-Element-Trennwände, die Sie im Bild sehen kann?

  • Wie kann ich die volle Breite Teiler rechts, oben Header, oder wie kann ich loswerden der internen fragment/activity Polsterung? Natürlich ist meine Aktivität layout hat keine (explizite) Polsterung überhaupt.

  • Ausgewählte Antwort
    natario
    3. Februar 2015

    Hatte völlig vergessen, über diese Frage, wird die post eine Antwort jetzt, um anderen zu helfen. Ich gelöst, indem mein code in den onResume() Methode, die Aktivität, die meine hosts PreferenceFragment. Ich denke, es gibt mehrere andere Punkte, an die Sie sich erinnern kann ein nicht-null - ListView mit 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;
            }
        }
    }
    

    Wahrscheinlich können Sie loszuwerden, die rootView prüfen, aber zur gleichen Zeit möglicherweise möchten Sie auch zu prüfen, für die list != null. Ich habe nicht das Gesicht einer NPE diese Weise sowieso.

    Also, setDivider(null) nimmt das item-Element Teiler. Ich es geschafft, fügen Sie im Abschnitt Teiler deckt die volle Breite des Bildschirms von:

    • Entfernen der Polsterung aus list;
    • Hinzufügen einer benutzerdefinierten Voreinstellung in meinem XML:

    n

     <Preference
         android:title="divider"
         android:selectable="false"
         android:layout="@layout/preference_divider"/>
    

8 Antworten

  • SagiLow
    14. Januar 2015

    Fügen Sie diesen code unter der 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);
    
        }
    
  • X3Btel
    24. Juli 2015

    Zwar ein bisschen spät, ich habe gleiche Probleme mit Trennwänden in preff-Bildschirm und fand diese Lösung: Legen Sie benutzerdefinierte Stil auf die hosting-Aktivität und hinzufügen, um den Stil:

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

    Es ist tatsächlich nicht der gleiche wie die Einstellung durch code, aber Sie sparen ein findById und ich denke, es sieht klarer Satz Trog Stile

  • formatBCE
    14. Februar 2017

    Für PreferenceFragmentCompat, ListView funktioniert nicht. Aber dies funktioniert wie ein Charme:

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

    Fügen Sie diese, um Ihre app-Designs:

    <item name="preferenceTheme">@style/PrefsTheme</item>
    
  • sadmonster
    12. April 2017

    wenn Sie eine PreferenceFragment ,können Sie die Listenansicht.setDivider(null); wenn Sie eine PreferenceFragmentCompat ,die Sie verwenden können, PreferenceFragmentCompat.setDivider(Drawable divider) oder setDividerHeight(int height);

  • dphans
    25. Dezember 2017

    Neue Lösung für das neue android-API 24 und höher (25. Dezember 2017).

    Ich habe festgestellt, nach versuchen, viele Möglichkeiten, auf stackoverflow, aber nicht arbeiten, oder es einfach nur Arbeit, aber nicht Arbeit in nestest PreferenceScreen.

    Erste, Sie brauchen, um zu finden listview aus dem aktuellen anzeigen-fragment, und die Trennlinie zu entfernen:

    private fun removeDividerInCurrentFragment() {
        this@YourPreferenceActivity.fragmentManager.findFragmentById(android.R.id.content)?.let {
            it.view?.findViewById<ListView?>(android.R.id.list)?.let {
                it.divider = null
                it.dividerHeight = 0
            }
        }
    }
    

    Zweitens, um die Trennlinie zu entfernen, wenn das fragment begangen wird, rufen Sie die Methode oben (removeDividerInCurrentFragment) entfernen listview-Teiler.

    Um sicherzustellen, dass wenn Sie nestest PreferenceScreen. Register, welches bei dem fragment geändert in PreferenceActivity durch die Implementierung FragmentManager.OnBackStackChangedListener Protokoll:

    class YourPreferenceActivity : PreferenceActivity(), FragmentManager.OnBackStackChangedListener {
        override fun onBackStackChanged() {
            this@YourPreferenceActivity.removeDividerInCurrentFragment()
        }
    }
    

    Schließlich registrieren backstack änderungen listener durch Aufruf fragmentManager.addOnBackStackChangedListener(this@ YourPreferenceActivity) in onCreate. Und entfernen backstack änderungen listener durch Aufruf fragmentManager.removeOnBackStackChangedListener in onDestroyed Methode.

    Viel Glück!

  • The Finest Artist
    12. Februar 2018

    Sie können re-style-Teiler mit diesem Thema.

    <style name="PreferenceFragment.Material">
        <item name="android:divider">@drawable/preference_list_divider_material</item>
    </style>
    
  • doubleA
    14. August 2018

    Ich hatte genau dieses problem und wollte Trennwänden zwischen den preference-Kategorien, aber nicht zwischen den Einzelteilen selbst. Ich fand, dass die akzeptierten Lösung zufrieden Frage 1 durch entfernen der Trennwände aus Einstellungselemente, aber nicht behoben wurde Frage 2 und fügen Sie den Trennwänden zwischen den preference-Kategorien.

    Update unten. Grundsätzlich überschreiben der onCreateAdapter Methode Ihrer PreferenceFragmentCompat und geben Sie eine benutzerdefinierte PreferenceGroupAdapter, die überschrieben wurde onBindViewHolder Methode verwendet, die die position und was Sie sonst noch benötigen, um oben und unten die Berechtigungen für jede Ansicht Halter. Eine Trennlinie wird gezogen, wenn beide viewholders ermöglichen eine Trennwand zwischen Ihnen.

    Hier ist mein fix

    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);
            }
        }
    }
    
  • Maksim Ivanov
    4. Mai 2019

    AndroidX macht es einfach, aber ich wünschte, es war besser dokumentiert.

    In XML

    Zum hinzufügen/entfernen von Trennwänden zwischen den Einstellungen in XML die folgenden Attribute verwenden:

    <androidx.preference.PreferenceScreen
        xmlns:app="http://schemas.android.com/apk/res-auto">
    
        <Preference
            ...
            app:allowDividerAbove="true/false"
            app:allowDividerBelow="true/false"
            ... />
    
    </androidx.preference.PreferenceScreen>
    

    Beachten Sie, dass eine Trennlinie wird nur gezeigt werden zwischen zwei Einstellungen, wenn die oben genannten Teiler hat allowDividerBelow wurde auf true und die unten Teiler hat allowDividerAbove wurde auf true.

    Im Code

    Sie können auch ändern/entfernen-Teiler programmgesteuert mithilfe der folgenden Methoden in onActivityCreated Ihrer PreferenceFragmentCompat:

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
    
        // To remove:
        setDivider(null);
    
        // To change:
        setDivider(ContextCompat.getDrawable(getActivity(), R.drawable.your_drawable));
        setDividerHeight(your_height);
    }