Ich hatte Probleme bei der Verwendung der neuen Material Design-Symbolleiste in der Support-Bibliothek auf einem Einstellungsbildschirm.
Ich habe eine settings.xml-Datei wie folgt:
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceCategory
android:title="@string/AddingItems"
android:key="pref_key_storage_settings">
<ListPreference
android:key="pref_key_new_items"
android:title="@string/LocationOfNewItems"
android:summary="@string/LocationOfNewItemsSummary"
android:entries="@array/new_items_entry"
android:entryValues="@array/new_item_entry_value"
android:defaultValue="1"/>
</PreferenceCategory>
</PreferenceScreen>
Die Zeichenfolgen werden an anderer Stelle definiert.
android
android-actionbar
android-5.0-lollipop
android-actionbar-compat
android-toolbar
James Cross
quelle
quelle
Antworten:
Das GitHub Repo finden Sie hier
Ein bisschen spät zur Party, aber dies ist meine Lösung, die ich verwende, um weiterhin zu verwenden
PreferenceActivity
:settings_toolbar.xml :
SettingsActivity.java :
Result :
UPDATE (Lebkuchen-Kompatibilität):
Gemäß den Kommentaren geben Lebkuchengeräte NullPointerException in dieser Zeile zurück:
FIX:
SettingsActivity.java :
Alle Probleme mit den oben genannten lassen Sie es mich wissen!
UPDATE 2: TINTING WORKAROUND
Wie in vielen Entwicklungsnotizen erwähnt, wird
PreferenceActivity
das Abtönen von Elementen nicht unterstützt. Mit einigen internen Klassen können Sie dies jedoch erreichen. Das ist, bis diese Klassen entfernt werden. (Funktioniert mit appCompat support-v7 v21.0.3).Fügen Sie die folgenden Importe hinzu:
Überschreiben Sie dann die
onCreateView
Methode:Result:
AppCompat 22.1
AppCompat 22.1 führte neue getönte Elemente ein, sodass die internen Klassen nicht mehr verwendet werden müssen, um den gleichen Effekt wie beim letzten Update zu erzielen. Folgen Sie stattdessen diesem (immer noch überschreibenden
onCreateView
):NESTED PREFERENCE SCREENS
Viele Leute haben Probleme mit der Aufnahme der Symbolleiste in eine verschachtelte,
<PreferenceScreen />
aber ich habe eine Lösung gefunden !! - Nach viel Versuch und Irrtum!Fügen Sie Folgendes hinzu
SettingsActivity
:Der Grund dafür
PreferenceScreen
ist, dass sie als Wrapper-Dialogfeld basieren. Daher müssen wir das Dialogfeld-Layout erfassen, um die Symbolleiste hinzuzufügen.Symbolleistenschatten
Durch das Importieren von Designs ist das
Toolbar
Aufheben und Abschatten in Geräten vor Version 21 nicht möglich. Wenn Sie also eine Höhe auf Ihrem Gerät haben möchten, müssenToolbar
Sie diese in Folgendes einschließenAppBarLayout
:settings_toolbar.xml
::Nicht zu vergessen, dass Sie die Design Support-Bibliothek als Abhängigkeit in der
build.gradle
Datei hinzufügen :Android 6.0
Ich habe das gemeldete überlappende Problem untersucht und kann das Problem nicht reproduzieren.
Der oben verwendete vollständige Code erzeugt Folgendes:
Wenn mir etwas fehlt, lass es mich bitte über dieses Repo wissen und ich werde es untersuchen.
quelle
Sie können a
PreferenceFragment
als Alternative zu verwendenPreferenceActivity
. Hier ist dasActivity
Beispiel für die Verpackung :Und hier ist die Layoutdatei (pref_with_actionbar):
Und zum Schluss die
PreferenceFragment
:Ich hoffe das hilft jemandem.
quelle
ActionBarActivity
, um die Symbolleiste und die zugehörigen Funktionen abzurufen, gibt es keineonBuildHeaders()
zu überschreibende und keine tatsächliche Präferenzunterstützung in der Aktivität. Wenn Sie die alte verwendenPreferenceActivity
, verfügen Sie nicht über die Symbolleiste und die zugehörigen Funktionen (ja, Sie können eineToolbar
und ein Layout haben, aber Sie können nicht aufrufensetSupportActionBar()
. Entweder mit Präferenzüberschriften oder verschachtelten Präferenzbildschirmen scheinen wir festzustecken.Komplett neues Update.
Mit einigen Experimenten habe ich anscheinend die funktionierende AppCompat 22.1+ -Lösung für verschachtelte Einstellungsbildschirme gefunden.
Erstens müssen Sie, wie in vielen Antworten erwähnt (einschließlich einer hier), die neue verwenden
AppCompatDelegate
. Verwenden Sie entweder dieAppCompatPreferenceActivity.java
Datei aus den Support-Demos ( https://android.googlesource.com/platform/development/+/58bf5b99e6132332afb8b44b4c8cedf5756ad464/samples/Support7Demos/src/com/example/android/supportv7/app/AppC ) oder kopieren Sie die relevanten Funktionen in Ihre eigenenPreferenceActivity
. Ich werde hier den ersten Ansatz zeigen:Das dazugehörige Layout ist recht einfach und üblich (
layout/settings_page.xml
):Die Einstellungen selbst sind wie gewohnt definiert (
xml/settings.xml
):Bis zu diesem Zeitpunkt gibt es keinen wirklichen Unterschied zu Lösungen im Internet. Tatsächlich können Sie dies auch dann verwenden, wenn Sie keine verschachtelten Bildschirme, keine Überschriften, nur einen einzigen Bildschirm haben.
Wir verwenden eine gemeinsame
PreferenceFragment
für alle tieferen Seiten, die sich durch dieextra
Parameter in den Kopfzeilen unterscheiden. Jede Seite hat ein separates XML mit einem gemeinsamenPreferenceScreen
Inneren (xml/settings_page1.xml
et al.). Das Fragment verwendet dasselbe Layout wie die Aktivität, einschließlich der Symbolleiste.Zum Schluss noch eine kurze Zusammenfassung, wie das tatsächlich funktioniert. Mit der neuen Funktion
AppCompatDelegate
können wir alle Aktivitäten mit AppCompat-Funktionen verwenden, nicht nur solche, die von den Aktivitäten in AppCompat ausgehen. Dies bedeutet, dass wir das gute altePreferenceActivity
in ein neues verwandeln und die Symbolleiste wie gewohnt hinzufügen können. Ab diesem Zeitpunkt können wir uns an die alten Lösungen für Einstellungsbildschirme und Überschriften halten, ohne von der vorhandenen Dokumentation abzuweichen. Es gibt nur einen wichtigen Punkt: NichtonCreate()
in der Aktivität verwenden, da dies zu Fehlern führen kann. Verwenden Sie diese OptiononBuildHeaders()
für alle Vorgänge wie das Hinzufügen der Symbolleiste.Der einzige wirkliche Unterschied besteht darin, dass Sie mit verschachtelten Bildschirmen den gleichen Ansatz für die Fragmente verwenden können. Sie können sie auf
onCreateView()
die gleiche Weise verwenden, indem Sie Ihr eigenes Layout anstelle des Systemlayouts aufblasen und die Symbolleiste auf die gleiche Weise wie in der Aktivität hinzufügen.quelle
R.drawable.abc_ic_ab_back_mtrl_am_alpha
PreferenceFragmentCompat
stattPreferenceFragment
. Wenn Sie einenpreference-header
mitxmlns:app="http://schemas.android.com/apk/res-auto"
und dannapp:fragment
anstelle vonandroid:fragment
einrichten, wird kein neuer Einstellungsbildschirm geladen. Haben Sie also Probleme mit der Abwärtskompatibilität ... Vorschläge?Wenn Sie PreferenceHeaders verwenden möchten, können Sie den folgenden Ansatz verwenden:
layout / activity_settings.xml
Sie können hier jedes Layout verwenden, das Sie bevorzugen. Stellen Sie jedoch sicher, dass Sie es auch im Java-Code anpassen.
Und schließlich Ihre Datei mit Headern (xml / pref_headers.xml)
quelle
android.R.id.content
, wenn man bedenkt wir früher ein weitergebenListView
mitandroid.R.id.list
der Präferenzliste selbst (und immer noch tun , wenn das Fragment lose Verwendung headerless, Art und Weise) statt.Mit der Veröffentlichung der Android Support Library 22.1.0 und des neuen AppCompatDelegate finden Sie hier ein schönes Beispiel für eine Implementierung der PreferenceActivity mit Materialunterstützung mit Abwärtskompatibilität.
Update Es funktioniert auch auf verschachtelten Bildschirmen.
https://android.googlesource.com/platform/development/+/marshmallow-mr3-release/samples/Support7Demos/src/com/example/android/supportv7/app/AppCompatPreferenceActivity.java
quelle
Obwohl die obigen Antworten ausführlich erscheinen
PreferenceActivity
, habe ich Hilfe von diesem Projekt erhalten , wenn Sie eine schnelle Lösung für die Verwendung der Symbolleiste mit Support-API 7 und höher während der Erweiterung benötigen.https://github.com/AndroidDeveloperLB/ActionBarPreferenceActivity
activity_settings.xml
SettingsActivity.java
quelle
Auch ich habe nach einer Lösung gesucht, um die v7- Support-Symbolleiste ( API 25 ) zur AppCompatPreferenceActivity hinzuzufügen (die von AndroidStudio beim Hinzufügen einer SettingsActivity automatisch erstellt wird). Nachdem ich mehrere Lösungen gelesen und jede ausprobiert hatte, bemühte ich mich, die generierten PreferenceFragment-Beispiele auch mit einer Symbolleiste anzuzeigen.
Eine modifizierte Lösung, die irgendwie funktionierte, war von " Gabor ".
Eine der Vorbehalte, mit denen ich konfrontiert war, war, dass 'onBuildHeaders' nur einmal feuerte. Wenn Sie ein Gerät (wie ein Telefon) zur Seite drehen, wird die Ansicht neu erstellt und die PreferenceActivity wird wieder ohne Symbolleiste angezeigt. Die PreferenceFragments behalten jedoch ihre.
Ich habe versucht, mit 'onPostCreate' 'setContentView' aufzurufen, während dies dazu diente, die Symbolleiste neu zu erstellen, wenn sich die Ausrichtung änderte. PreferenceFragments wurde dann leer gemacht.
Was ich mir ausgedacht habe, nutzt fast jeden Tipp und jede Antwort, die ich zu diesem Thema lesen konnte. Ich hoffe, andere finden es auch nützlich.
Wir werden mit Java beginnen
Zuerst in (der generierten) AppCompatPreferenceActivity.java habe ich 'setSupportActionBar' wie folgt geändert:
Zweitens habe ich eine neue Klasse mit dem Namen AppCompatPreferenceFragment.java erstellt (es ist derzeit ein nicht verwendeter Name, obwohl dies möglicherweise nicht so bleibt!):
Dies ist der Teil von Gabors Antwort, der funktioniert hat.
Last , Konsistenz gelangen müssen wir einige Änderungen machen SettingsActivity.java :
Einige Codes wurden der Kürze halber aus der Aktivität herausgelassen. Die Schlüsselkomponenten hier sind ' onAttachedFragment ', ' onPostCreate ' und das 'GeneralPreferenceFragment' erweitert jetzt das benutzerdefinierte ' AppCompatPreferenceFragment ' anstelle von PreferenceFragment.
Codeübersicht : Wenn ein Fragment vorhanden ist, fügt das Fragment das neue Layout ein und ruft die geänderte Funktion 'setSupportActionBar' auf. Wenn das Fragment nicht vorhanden ist, fügt SettingsActivity das neue Layout in 'onPostCreate' ein.
Nun zum XML (sehr einfach):
activity_settings.xml :
app_bar_settings.xml :
content_settings.xml :
Endergebnis :
quelle
Ich habe eine neue (möglicherweise übersichtlichere) Lösung, die die Beispiele
AppCompatPreferenceActivity
aus dem Support v7 verwendet. Mit diesem Code habe ich mein eigenes Layout erstellt, das eine Symbolleiste enthält:Dann habe
AppCompatPreferenceActivity
ich in meinem geändertsetContentView
, um ein neues Layout zu erstellen, und das bereitgestellte Layout in meinFrameLayout
:Dann erweitere ich einfach
AppCompatPreferenceActivity
, damit ich auchsetSupportActionBar((Toolbar) findViewById(R.id.toolbar))
Menüelemente in der Symbolleiste aufrufen und aufblasen kann. Alles unter Beibehaltung der Vorteile von aPreferenceActivity
.quelle
Lassen Sie es uns hier einfach und sauber halten, ohne ein eingebautes Layout zu beschädigen
quelle
root.getChildAt(0);
kehrt zurücknull
.Ich habe diese einfache Lösung gefunden, als ich daran gearbeitet habe. Zuerst müssen wir ein Layout für die Einstellungsaktivität erstellen.
activity_settings.xml
Stellen Sie sicher, dass Sie eine Listenansicht mit hinzufügen
android:id="@android:id/list"
, da sie sonst ausgelöst wirdNullPointerException
Der nächste Schritt ist das Hinzufügen (Überschreiben) der
onCreate
Methode in Ihrer EinstellungsaktivitätSettings.java
Stellen Sie sicher, dass Sie importieren
android.suppoer.v7.widget.Toolbar
. Dies sollte auf allen APIs über 16 (Jelly Bean und höher) funktionieren.quelle
Ich möchte die markierte Lösung von James Cross fortsetzen, da danach das Problem besteht, nur den aktiven verschachtelten Bildschirm (PreferenceFragment) so zu schließen, dass die SettingsActivity nicht ebenfalls geschlossen wird.
Eigentlich funktioniert es auf allen verschachtelten Bildschirmen (daher verstehe ich die Lösung von Gábor, die ich erfolglos ausprobiert habe, nicht. Nun, es funktioniert bis zu einem bestimmten Punkt, aber es ist ein Durcheinander mehrerer Symbolleisten), weil der Benutzer auf einen Bildschirm mit Untereinstellungen klickt Es wird nur das Fragment geändert (siehe
<FrameLayout android:id="@+id/content_frame" .../>
), nicht die Symbolleiste, die immer aktiv und sichtbar bleibt. Es sollte jedoch ein benutzerdefiniertes Verhalten implementiert werden, um jedes Fragment entsprechend zu schließen.In der Hauptklasse ,
SettingsActivity
die sichActionBarActivity
die folgenden Methoden sollten umgesetzt werden. Beachten Sie, dass private vonsetupActionBar()
aufgerufen wirdonCreate()
Für den Titel des ausgewählten verschachtelten Bildschirms sollten Sie die Referenz Ihrer Symbolleiste abrufen und den entsprechenden Titel mit
toolbar.setTitle(R.string.pref_title_general);
(zum Beispiel) festlegen .Das PreferenceFragment muss nicht
getSupportActionBar()
in allen implementiert werden, da bei jedem Commit nur die Ansicht des Fragments geändert wird, nicht die Symbolleiste.Es ist nicht erforderlich , eine gefälschte ToolbarPreference-Klasse zu erstellen, um sie in jeder Einstellungen.xml hinzuzufügen (siehe Gábors Antwort).
quelle
Hier ist eine Bibliothek, die ich erstellt habe und die auf AOSP-Code basiert, der sowohl den Einstellungen als auch den Dialogen Farbtöne hinzufügt, eine Aktionsleiste hinzufügt und alle Versionen von API 7 unterstützt:
https://github.com/AndroidDeveloperLB/MaterialPreferenceLibrary
quelle
PreferenceScreen
Innern einPreferenceScreen
wie dieserNun, das ist heute (18. November 2015) immer noch ein Problem für mich. Ich habe alle Lösungen aus diesem Thread ausprobiert, aber es gab zwei Hauptprobleme, die ich nicht lösen konnte:
Also habe ich eine Bibliothek mit einer komplizierteren Lösung erstellt. Grundsätzlich musste ich Stile intern auf die Einstellungen anwenden, wenn wir ein Pre-Lollipop-Gerät verwenden, und ich habe auch die verschachtelten Bildschirme mit einem benutzerdefinierten Fragment behandelt (Wiederherstellung aller verschachtelten Hierarchien unter Verwendung des PreferenceScreen- Schlüssels ).
Die Bibliothek ist diese: https://github.com/ferrannp/material-preferences
Und wenn Sie sich für den Quellcode interessieren (zu lang, um ihn hier zu veröffentlichen), ist dies im Grunde der Kern davon: https://github.com/ferrannp/material-preferences/blob/master/library/src/main/ java / com / fnp / materialpreferences / PreferenceFragment.java
quelle