web-dev-qa-db-de.com

Wie verwalte ich Teiler in einem PreferenceFragment?

Ich fing an, mich mit Präferenzen in einem PreferenceFragmentzu beschäftigen. Folgendes habe ich:

my_preferences

Ich versuche zu:

  1. entferne die Trennlinien zwischen den Gegenständen. Ich nehme an, dass dies anhand von Stilen definiert werden kann, aber ich kann nicht herausfinden, wie. Ich habe versucht, die Einstellung ListViewzur Laufzeit abzurufen, indem ich findViewById(Android.R.id.list) aufgerufen habe, während ich irgendwo gelesen habe, aber sie gibt null zurück.

  2. setze neue volle Breite Trennlinien direkt über den Überschriften, wie in hier zu sehen. Zum Beispiel möchte ich in diesem Fall einen Teiler mit voller Breite direkt über "Statistiche", aber nicht über "Generali", der ganz oben auf der Liste steht.

Die einzige Möglichkeit, die mir in den Sinn kommt, besteht darin, Trennlinien als falsche Präferenzen festzulegen, wie zum Beispiel mit:

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

<PreferenceCategory ... />

Das Hauptproblem hierbei ist, dass mein PreferenceFragment(oder der ActionBarActivityname__) über einen Links-/Rechtsabstand verfügt, so dass jeder Teiler, den ich in preferences.xml nicht hinzufüge, die gesamte Breite abdeckt.

Meine Frage lautet also:

  • Wie kann ich Standardteiler für Artikel entfernen, die auf dem Bild zu sehen sind?

  • Wie kann ich Trennlinien in voller Breite direkt über Kopfzeilen setzen oder interne Fragment-/Aktivitätsauffüllungen entfernen? Natürlich hat mein Aktivitätslayout keinerlei (explizite) Auffüllung.

12
natario

Hatte diese Frage total vergessen, werde jetzt eine Antwort posten, um anderen zu helfen. Ich habe das Problem gelöst, indem ich meinen Code in der onResume()-Methode der Aktivität verschoben habe, in der sich meine PreferenceFragment befindet. Ich denke, es gibt mehrere andere Punkte, an denen Sie mit findViewById(Android.R.id.list) ein Nicht-Null-Objekt ListView abrufen können.

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;
        }
    }
}

Sie können den rootView-Check wahrscheinlich loswerden, aber gleichzeitig möchten Sie vielleicht sogar nach list != null suchen. Ich bin sowieso keiner NPE begegnet.

Also, setDivider(null) nimmt die Element-Element-Teiler ab. Es gelang mir, Abschnittsunterteilungen hinzuzufügen, die die gesamte Bildschirmbreite abdecken, indem:

  • Auffüllen von list;
  • Hinzufügen einer benutzerdefinierten Einstellung in mein XML:

n

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

Fügen Sie diesen Code unter der PreferenceFragment hinzu:

    @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

Obwohl ich etwas spät komme, habe ich dieselben Probleme mit den Teilern im Preff-Bildschirm und habe diese Lösung gefunden: Legen Sie einen benutzerdefinierten Stil für die Hosting-Aktivität fest und fügen Sie den Stil hinzu:

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

Es macht eigentlich dasselbe wie das Einstellen des Codes durch den Code, aber Sie speichern eine findById und ich denke, es sieht klarer aus, wenn Sie die Stile festlegen

10
X3Btel

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

In XML

Verwenden Sie die folgenden Attribute, um Trennlinien zwischen Einstellungen in XML hinzuzufügen/zu entfernen:

<androidx.preference.PreferenceScreen
    xmlns:app="http://schemas.Android.com/apk/res-auto">

    <Preference
        ...
        app:allowDividerAbove="true/false"
        app:allowDividerBelow="true/false"
        ... />

</androidx.preference.PreferenceScreen>

Hinweis: Ein Teiler wird nur zwischen zwei Einstellungen angezeigt, wenn der obere Teiler allowDividerBelow auf true und der untere Teiler allowDividerAbove auf true eingestellt ist.

In Code

Sie können Teiler auch programmgesteuert mit den folgenden Methoden in onActivityCreated Ihres PreferenceFragmentCompat ändern/entfernen:

@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);
}
10
Maksim Ivanov

Für PreferenceFragmentCompat funktioniert ListView nicht. Das funktioniert aber wie ein Zauber:

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

Fügen Sie dies zu Ihrem App-Thema hinzu:

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

(nur AndroidX)

Maksim Ivanovs Antwort hat mich den größten Teil des Weges dorthin gebracht. Aber um Teiler nur für eine bestimmte Voreinstellung zu entfernen, die im Code erstellt wurde, musste ich Folgendes tun:

val pref = object : Preference(activity) {
    override fun onBindViewHolder(holder: PreferenceViewHolder) {
        super.onBindViewHolder(holder)
        // By default, preferences created in code show dividers
        holder.setDividerAllowedAbove(false)
        holder.setDividerAllowedBelow(false)
    }
}
1
Stephen Talley

Ich hatte genau dieses Problem und wollte Trennlinien zwischen den Präferenzkategorien, nicht jedoch zwischen den Elementen selbst. Ich habe festgestellt, dass die akzeptierte Lösung die Frage 1 befriedigte, indem sie die Teiler von den Vorzugselementen entfernte, aber die Frage 2 nicht fixierte und die Teiler zwischen den Vorzugskategorien hinzufügte.

Fix unten. Überschreiben Sie grundsätzlich die onCreateAdapter-Methode Ihres PreferenceFragmentCompat, und weisen Sie ihm einen benutzerdefinierten PreferenceGroupAdapter zu, der über eine überschriebene onBindViewHolder-Methode verfügt, die die Position und alle anderen Einstellungen verwendet, die Sie für jeden Ansichtsinhaber oben und unten festlegen müssen. Ein Teiler wird gezeichnet, wenn beide Ansichtshalter einen Teiler zwischen ihnen zulassen.

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);
        }
    }
}
1
doubleA

Sie können Ihren Teiler mit diesem Thema neu gestalten.

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

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

Ich habe nach dem Versuch viele Wege auf stackoverflow gefunden, aber nicht funktionieren, oder es funktioniert einfach, aber nicht in nestest PreferenceScreen.

Zunächst müssen Sie nach der Listenansicht des aktuell angezeigten Fragmentes suchen und den Teiler entfernen:

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
        }
    }
}

Zweitens: Um den Teiler zu entfernen, wenn das Fragment festgeschrieben wurde, rufen Sie die Methode oben (removeDividerInCurrentFragment) auf, um den Teiler von Listview zu entfernen.

Um sicher zu sein, dass Sie nestest PreferenceScreenhaben. Registrieren Sie den Listener, wenn sich das Fragment in Ihrer PreferenceActivity mit dem FragmentManager.OnBackStackChangedListener-Protokoll von implement geändert hat:

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

Registrieren Sie abschließend Backstack-Änderungslistener mit dem Aufruf fragmentManager.addOnBackStackChangedListener([email protected] YourPreferenceActivity) in onCreate. Entfernen Sie den Backstack-Änderungslistener, indem Sie fragmentManager.removeOnBackStackChangedListener in der onDestroyed-Methode aufrufen.

Viel Glück!

0
dphans

wenn Sie ein PreferenceFragment verwenden, können Sie ListView verwenden .setDivider(null); Wenn Sie PreferenceFragmentCompat verwenden, können Sie PreferenceFragmentCompat verwenden. setDivider(Drawable divider) oder setDividerHeight(int height);

0
sadmonster