J'avais du mal à utiliser la nouvelle barre d'outils Material Design dans la bibliothèque de support sur un écran de préférences.
J'ai un fichier settings.xml comme ci-dessous:
<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>
Les chaînes sont définies ailleurs.
android
android-actionbar
android-5.0-lollipop
android-actionbar-compat
android-toolbar
James Cross
la source
la source
Réponses:
Veuillez trouver le dépôt GitHub: ici
Un peu tard à la fête, mais c'est ma solution que j'utilise pour contourner le fait de continuer à utiliser
PreferenceActivity
:settings_toolbar.xml :
SettingsActivity.java :
Result :
MISE À JOUR (compatibilité pain d'épice):
Selon les commentaires, Gingerbread Devices renvoie NullPointerException sur cette ligne:
RÉPARER:
SettingsActivity.java :
Tout problème avec ce qui précède, faites-le moi savoir!
MISE À JOUR 2: CONTOURNEMENT DE TEINTE
Comme indiqué dans de nombreuses notes de développement,
PreferenceActivity
ne prend pas en charge la teinte des éléments, mais en utilisant quelques classes internes, vous POUVEZ y parvenir. C'est jusqu'à ce que ces classes soient supprimées. (Fonctionne avec le support appCompat-v7 v21.0.3).Ajoutez les importations suivantes:
Remplacez ensuite la
onCreateView
méthode:Result:
AppCompat 22.1
AppCompat 22.1 a introduit de nouveaux éléments teintés, ce qui signifie qu'il n'est plus nécessaire d'utiliser les classes internes pour obtenir le même effet que la dernière mise à jour. Au lieu de cela, suivez ceci (toujours prioritaire
onCreateView
):ÉCRANS DE PRÉFÉRENCE EMBARQUÉS
Beaucoup de gens rencontrent des problèmes pour inclure la barre d'outils dans un imbriqué,
<PreferenceScreen />
cependant, j'ai trouvé une solution !! - Après de nombreux essais et erreurs!Ajoutez ce qui suit à votre
SettingsActivity
:La raison pour laquelle cela
PreferenceScreen
est si pénible est parce qu'ils sont basés comme une boîte de dialogue wrapper, nous devons donc capturer la disposition de la boîte de dialogue pour y ajouter la barre d'outils.Ombre de la barre d'outils
De par sa conception, l'importation de
Toolbar
ne permet pas d'élévation et d'ombrage dans les appareils antérieurs à la v21, donc si vous souhaitez avoir une élévation sur votre,Toolbar
vous devez l'envelopper dans unAppBarLayout
:settings_toolbar.xml
:Sans oublier d'ajouter l'ajout de la bibliothèque Design Support en tant que dépendance dans le
build.gradle
fichier:Android 6.0
J'ai étudié le problème de chevauchement signalé et je ne peux pas reproduire le problème.
Le code complet utilisé comme ci-dessus produit les éléments suivants:
S'il me manque quelque chose, veuillez me le faire savoir via ce dépôt et j'enquêterai .
la source
Vous pouvez utiliser a
PreferenceFragment
, comme alternative àPreferenceActivity
. Alors, voici l'Activity
exemple d' emballage :Et voici le fichier de mise en page (pref_with_actionbar):
Et enfin le
PreferenceFragment
:J'espère que ça aidera quelqu'un.
la source
ActionBarActivity
pour obtenir la barre d'outils et les fonctions associées, il n'y aura pasonBuildHeaders()
de remplacement ni de prise en charge réelle des préférences dans l'activité. Si vous utilisez l'ancienPreferenceActivity
, vous n'avez pas la barre d'outils et les fonctions associées (oui, vous pouvez avoir uneToolbar
mise en page et mais vous ne pouvez pas appelersetSupportActionBar()
. Donc, que ce soit avec des en-têtes de préférence ou des écrans de préférences imbriqués, nous semblons bloqués.Complètement nouvelle mise à jour.
Avec quelques expérimentations, il me semble avoir trouvé la solution AppCompat 22.1+ fonctionnelle pour les écrans de préférences imbriqués.
Tout d'abord, comme cela est mentionné dans de nombreuses réponses (dont une ici), vous devrez utiliser le nouveau
AppCompatDelegate
. Soit utiliser leAppCompatPreferenceActivity.java
fichier des démos de support ( https://android.googlesource.com/platform/development/+/58bf5b99e6132332afb8b44b4c8cedf5756ad464/samples/Support7Demos/src/com/example/android/supportv7/app/ extendCompatible et extendCreference ) à partir de celui-ci, ou copiez les fonctions pertinentes dans les vôtresPreferenceActivity
. Je vais montrer la première approche ici:La mise en page d'accompagnement est plutôt simple et habituelle (
layout/settings_page.xml
):Les préférences elles-mêmes sont définies comme d'habitude (
xml/settings.xml
):Pas de réelle différence avec les solutions sur le net jusqu'à présent. En fait, vous pouvez l'utiliser même si vous n'avez pas d'écrans imbriqués, pas d'en-têtes, juste un seul écran.
Nous utilisons un commun
PreferenceFragment
pour toutes les pages plus profondes, différencié par lesextra
paramètres dans les en-têtes. Chaque page aura un XML séparé avec unPreferenceScreen
intérieur commun (xml/settings_page1.xml
et al.). Le fragment utilise la même disposition que l'activité, y compris la barre d'outils.Enfin, un bref résumé de la façon dont cela fonctionne réellement. Le nouveau
AppCompatDelegate
nous permet d'utiliser n'importe quelle activité avec les fonctionnalités AppCompat, pas seulement celles qui s'étendent à partir des activités réellement dans AppCompat. Cela signifie que nous pouvons transformer le bon vieuxPreferenceActivity
en un nouveau et ajouter la barre d'outils comme d'habitude. À partir de là, nous pouvons nous en tenir aux anciennes solutions concernant les écrans de préférences et les en-têtes, sans aucun écart par rapport à la documentation existante. Il y a juste un point important: ne pas utiliseronCreate()
dans l'activité car cela entraînerait des erreurs. À utiliseronBuildHeaders()
pour toutes les opérations telles que l'ajout de la barre d'outils.La seule vraie différence est que, et c'est ce qui le fait fonctionner avec des écrans imbriqués, c'est que vous pouvez utiliser la même approche avec les fragments. Vous pouvez les utiliser de
onCreateView()
la même manière, en gonflant votre propre mise en page au lieu de celle du système, en ajoutant la barre d'outils de la même manière que dans l'activité.la source
R.drawable.abc_ic_ab_back_mtrl_am_alpha
PreferenceFragmentCompat
au lieu dePreferenceFragment
. La configuration d'unpreference-header
avecxmlns:app="http://schemas.android.com/apk/res-auto"
et puisapp:fragment
au lieu deandroid:fragment
ne charge aucun nouvel écran de préférences. Donc, avoir des problèmes avec la compatibilité ascendante ... des suggestions?Si vous souhaitez utiliser PreferenceHeaders, vous pouvez utiliser l'approche suivante:
layout / activity_settings.xml
Vous pouvez utiliser la mise en page que vous préférez ici, assurez-vous simplement de l'ajuster également dans le code Java.
Et enfin, votre fichier avec les en-têtes (xml / pref_headers.xml)
la source
android.R.id.content
, étant donné que nous avions l'habitude de passer unListView
avecandroid.R.id.list
pour la liste de préférences elle-même (et le faisons toujours si vous utilisez la méthode sans fragment, sans en-tête) à la place.Avec la sortie de la bibliothèque de support Android 22.1.0 et du nouveau AppCompatDelegate, vous pouvez trouver ici un bel exemple d'implémentation de PreferenceActivity avec prise en charge matérielle avec compatibilité descendante.
Mise à jour Cela fonctionne également sur les écrans imbriqués.
https://android.googlesource.com/platform/development/+/marshmallow-mr3-release/samples/Support7Demos/src/com/example/android/supportv7/app/AppCompatPreferenceActivity.java
la source
Bien que les réponses ci-dessus semblent élaborées, si vous voulez une solution rapide pour utiliser la barre d'outils avec le support API 7 et plus tout en s'étendant
PreferenceActivity
, j'ai obtenu l'aide de ce projet ci-dessous.https://github.com/AndroidDeveloperLB/ActionBarPreferenceActivity
activity_settings.xml
SettingsActivity.java
la source
Moi aussi, j'ai cherché une solution pour ajouter la barre d'outils de support v7 ( API 25 ) à AppCompatPreferenceActivity (qui est automatiquement créée par AndroidStudio lors de l'ajout d'un SettingsActivity). Après avoir lu plusieurs solutions et essayé chacune d'elles, j'ai eu du mal à afficher les exemples PreferenceFragment générés avec une barre d'outils.
Une solution modifiée qui fonctionnait en quelque sorte provenait de " Gabor ".
L'une des mises en garde auxquelles j'ai été confronté était les incendies «onBuildHeaders» une seule fois. Si vous tournez un appareil (comme un téléphone) sur le côté, la vue est recréée et PreferenceActivity est à nouveau laissée sans barre d'outils, mais les PreferenceFragments conserveraient les leurs.
J'ai essayé d'utiliser «onPostCreate» pour appeler «setContentView», alors que cela fonctionnait pour recréer la barre d'outils lorsque l'orientation changeait, PreferenceFragments serait alors rendu vide.
Ce que j'ai trouvé tire parti de presque tous les conseils et réponses que j'ai pu lire sur ce sujet. J'espère que d'autres le trouveront également utile.
Nous allons commencer par le Java
D'abord dans (la) AppCompatPreferenceActivity.java, j'ai modifié 'setSupportActionBar' comme ceci:
Deuxièmement , j'ai créé une nouvelle classe nommée AppCompatPreferenceFragment.java (c'est actuellement un nom inutilisé, bien qu'il ne puisse pas rester ainsi!):
C'est la partie de la réponse de Gabor qui a fonctionné.
Enfin , pour obtenir la cohérence, nous devons apporter des modifications à SettingsActivity.java :
Certains codes ont été exclus de l'activité par souci de concision. Les composants clés ici sont « onAttachedFragment », « onPostCreate », et le «GeneralPreferenceFragment» étend désormais le « AppCompatPreferenceFragment » personnalisé au lieu de PreferenceFragment.
Résumé du code : si un fragment est présent, le fragment injecte la nouvelle mise en page et appelle la fonction modifiée 'setSupportActionBar'. Si le fragment n'est pas présent, SettingsActivity injecte la nouvelle mise en page sur 'onPostCreate'
Passons maintenant au XML (très simple):
activity_settings.xml :
app_bar_settings.xml :
content_settings.xml :
Résultat final :
la source
J'ai une nouvelle solution (peut-être plus soignée), qui utilise les
AppCompatPreferenceActivity
exemples de Support v7. Avec ce code en main, j'ai créé ma propre mise en page qui comprend une barre d'outils:Ensuite, dans mon
AppCompatPreferenceActivity
, j'ai modifiésetContentView
pour créer une nouvelle mise en page et placer la mise en page fournie dans monFrameLayout
:Ensuite
AppCompatPreferenceActivity
, j'étends simplement , me permettant d'appelersetSupportActionBar((Toolbar) findViewById(R.id.toolbar))
et de gonfler les éléments de menu dans la barre d'outils également. Tout en gardant les avantages d'unPreferenceActivity
.la source
Gardons les choses simples et propres ici, sans casser aucune mise en page intégrée
la source
root.getChildAt(0);
revientnull
.J'ai trouvé cette solution simple en travaillant là-dessus. Nous devons d'abord créer une mise en page pour l'activité des paramètres.
activity_settings.xml
Assurez-vous d'ajouter une vue de liste avec
android:id="@android:id/list"
, sinon cela lanceraNullPointerException
La prochaine étape consiste à ajouter la
onCreate
méthode (Override) dans votre activité de paramètresSettings.java
Assurez-vous d'importer
android.suppoer.v7.widget.Toolbar
. Cela devrait fonctionner à peu près sur toutes les API au-dessus de 16 (Jelly Bean et plus)la source
Je voudrais continuer la solution marquée de James Cross, car après cela, il y a un problème de fermeture uniquement de l'écran imbriqué actif (PreferenceFragment) de manière à ne pas fermer également SettingsActivity.
En fait cela fonctionne sur tous les écrans imbriqués (donc je ne comprends pas la solution de Gábor que j'ai essayée sans succès, eh bien cela fonctionne jusqu'à un certain point mais c'est un désordre de plusieurs barres d'outils), car lorsque l'utilisateur clique sur un écran de sous-préférences , seul le fragment est modifié (voir
<FrameLayout android:id="@+id/content_frame" .../>
) pas la barre d'outils qui reste toujours active et visible, mais un comportement personnalisé doit être implémenté pour fermer chaque fragment en conséquence.Dans la classe principale
SettingsActivity
qui étendActionBarActivity
les méthodes suivantes doivent être implémentées. Notez que privatesetupActionBar()
est appelé depuisonCreate()
Pour le titre de l'écran imbriqué choisi, vous devez obtenir la référence de votre barre d'outils et définir le titre approprié avec
toolbar.setTitle(R.string.pref_title_general);
(par exemple).Il n'est pas nécessaire d'implémenter le
getSupportActionBar()
in all PreferenceFragment puisque seule la vue du fragment est modifiée à chaque validation, pas la barre d'outils;Il n'est pas nécessaire de créer une fausse classe ToolbarPreference à ajouter dans chaque fichier preferences.xml (voir la réponse de Gábor).
la source
Voici une bibliothèque que j'ai créée et basée sur le code AOSP, qui ajoute une teinte aux préférences et aux boîtes de dialogue, ajoute une barre d'action et prend en charge toutes les versions de l'API 7:
https://github.com/AndroidDeveloperLB/MaterialPreferenceLibrary
la source
PreferenceScreen
intérieurPreferenceScreen
comme çaEh bien, c'est toujours un problème pour moi aujourd'hui (18 novembre 2015). J'ai essayé toutes les solutions de ce fil, mais il y avait deux choses principales que je ne pouvais pas résoudre:
J'ai donc fini par créer une bibliothèque avec une solution plus compliquée. Fondamentalement, j'ai dû appliquer en interne des styles aux préférences si nous utilisons un périphérique pré-Lollipop et j'ai également géré les écrans imbriqués à l'aide d'un fragment personnalisé (restauration de toute la hiérarchie imbriquée en profitant de la clé PreferenceScreen ).
La bibliothèque est celle-ci: https://github.com/ferrannp/material-preferences
Et si vous êtes intéressé par le code source (trop long pour le poster ici), c'est en gros le noyau: https://github.com/ferrannp/material-preferences/blob/master/library/src/main/ java / com / fnp / materialpreferences / PreferenceFragment.java
la source