Comment ouvrir ou de simuler un clic sur un android Préférence, créé avec XML, par programmation?
J'ai une application android avec des préférences déclarées en XML, chargé de addPreferencesFromResource
. L'utilisateur peut ouvrir les préférences, cliquez sur chaque élément et de les éditer, de toutes les œuvres.
Une préférence que j'ai est:
<ListPreference android:key="abc"
android:title="@string/abc"
android:summary="@string/cde"
android:persistent="true"/>
Comment puis-je afficher la boîte de dialogue préférences d'un utilisateur de manière automatique (sans le besoin de l'utilisateur pour accéder à l'écran de préférences et cliquez sur elle?).
J'ai essayé ( (android.preference.DialogPreference) prefMgr.findPreference( "abc" )).showDialog(null)
, mais il est dit que c'est une méthode protégée...? Il l'a appelé de mon activité principale (qui est un PreferenceActivity
), c'est pourquoi il ne peut évidemment pas de travail. Mais comment faire autrement?
MODIFIER
Je viens de trouver deux threads (Un, et Deux) avec l'idée d'utiliser findViewById
pour accéder à la préférence, mais sans succès. Elle renvoie toujours null (pour moi aussi).
Il semble comme il n'y a vraiment aucune possibilité de le faire à partir du code.
- Vous voulez montrer un seul champ de toutes les préférences de l'écran? Ou tout simplement d'ouvrir l'ensemble de la boîte de dialogue préférences?
- Je veux afficher la boîte de dialogue de mon
ListPreference
(ou toutDialogPreference
), comme si je clic directement dans l'écran de préférences et il apparaît de - modifié en conséquence. Ma première question était trompeuse, désolé. CheckBoxPreference
n'ont pas une boîte de dialogue pop-up, vous cliquez simplement sur et en dehors.- vous avez raison, était une erreur dans le raisonnement. Toujours le problème avec un
DialogPreference
(plus précisémentListPreference
). Mise à jour de ma question.
Vous devez vous connecter pour publier un commentaire.
Vous pourriez avoir étendu ListPreference pour créer votre boîte de dialogue, puis inclus votre propre méthode publique qui appelle le protégé méthode showDialog de ListPreference. Quelque chose comme:
De cette façon, vous ne rencontrerez pas de la question de la getOrder() ne fonctionne pas quand il y a des PreferenceGroups comme plusieurs personnes l'ont souligné dans les commentaires de votre réponse.
Cela peut être fait avec tout les types de préférences qui a protégé méthode showDialog.
Voir le nouveau accepté de réponse beaucoup plus propre approche! C'était du travail, mais pas vraiment le propre façon de faire.
Putain, il m'a eu plusieurs heures, mais il fonctionne enfin.
La solution est le sans-papiers appel
public void onItemClick (...)
. Il prend plusieurs arguments, et comme l'a souligné cette question il peut être utilisé pour simuler un clic selon l'indice de l'élément que vous souhaitez appeler.Mon problème était le point je tiens à appeler est profondément imbriquée dans un XML de la structure. Mais la solution est très simple: ajouter un
key
à laPreferenceScreen
l'élément que vous souhaitez ouvrir dans:Et vous pouvez simplement les suivantes:
Et de la boîte de Dialogue pop-up!
Il serait agréable de se
PreferenceScreen
unPreference
est (de sorte que vous n'aurait pas à savoir où votrePreference
est), parce que le déplacement de la préférence/modifier le XML pourrait briser le automatique de la boîte de dialogue en silence et de ne pas se faire remarquer (si pas testé).Pour cela, j'ai écrit une fonction qui permet de rechercher à travers toutes les préférences et le retour de la
PreferenceScreen
votre préférence, de sorte que vous n'avez pas besoin d'avoir votre PreferenceScreen une clé!findPreference
de mon de la boîte de dialogueonClick
fonction? I. e. Je doit cliquer sur l'élément de Préférence, si l'utilisateur clique sur OK dans mon activité principale boîte de dialogue.Si vous utilisez la bibliothèque de prise en charge, vous pouvez ouvrir une boîte de dialogue facilement avec PreferenceManager.showDialog(de Préférence).
Dans votre PreferenceFragmentCompat:
Notez que le support de préférence paquet a de nombreux problèmes:
non matériau de coiffage et
il se bloque lors de la rotation avec une boîte de dialogue ouvrir.
L'amélioration de
deepak goel
's réponse:attendre, u peut faire quelque chose comme ceci aussi bien
abc
sans obliger l'utilisateur à cliquer sur elle (ou toute autre préférence).salut les amis, essayez ce code fonctionne très bien