J'ai une activité qui étend PreferenceActivity. Je charge les préférences du fichier XML. Mais dans certains cas, j'ai besoin de masquer complètement l'une des préférences de l'écran en fonction de l'état de mon application. Il existe une méthode setEnabled, mais ce n'est pas exactement ce que je veux. Je veux supprimer cette préférence de l'écran complètement. Est-ce possible?Supprimer/masquer une préférence de l'écran
Répondre
Oui, si vous avez une référence à la fois la Preference
, et son parent (un PreferenceCategory
ou PreferenceScreen
)
myPreferenceScreen.removePreference(myPreference);
Si votre Preference
est dans un PreferenceCategory
, vous devez faire ceci:
XML:
<PreferenceCategory
android:key="category_foo"
android:title="foo">
<CheckBoxPreference
android:key="checkPref" />
Java:
CheckBoxPreference mCheckBoxPref = (CheckBoxPreference) findPreference("checkPref");
PreferenceCategory mCategory = (PreferenceCategory) findPreference("category_foo");
mCategory.removePreference(mCheckBoxPref);
Pour être juste, la réponse ci-dessus dit que vous avez besoin du parent 'PreferenceCategory'. – matt
Dans le cas où la préférence est un enfant direct de l'écran de préférence, voici un code autonome:
PreferenceScreen screen = getPreferenceScreen();
Preference pref = getPreferenceManager().findPreference("mypreference");
screen.removePreference(pref);
Cela ne fonctionnera pas si la préférence est située dans la catégorie. vous devez 'findPreference' pour la catégorie, et supprimer la préférence de la catégorie – MBH
@MBH: Merci de mentionner cette mise en garde! –
Si vous voulez quelque chose qui va changer dynamiquement les prefs par exemple sur un SwitchPreference , J'ai trouvé que le meilleur moyen est de mettre toutes mes options secondaires dans des conteneurs de deux catégories. Au départ, vous aurez tout montré, alors vous supprimez simplement les bits que vous ne voulez pas. Le peu intelligent, est-ce que vous déclenchez juste recréer quand quelque chose change et alors vous ne devez pas créer manuellement n'importe quoi ou vous inquiétez de remettre des choses dans le bon ordre.
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences);
PreferenceCategory prefCatOne= (PreferenceCategory)findPreference("prefCatOne");
PreferenceCategory prefCatTwo= (PreferenceCategory)findPreference("prefCatTwo");
SwitchPreference mySwitchPref= (SwitchPreference)findPreference("mySwitchPref");
PreferenceScreen screen = getPreferenceScreen();
if (mySwitchPref.isChecked()) {
screen.removePreference(prefCatOne);
} else {
screen.removePreference(prefCatTwo);
}
}
public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
if (key.equals("mySwitchPref")) {
this.recreate();
}
}
Le seul inconvénient que je peux voir avec cela, est il y a un flash que l'écran est recréé à partir de zéro.
Le cas ne fonctionne pas, au moins pas dans 22. Mais le changer en une préférence (même si c'est un groupe de préférences) fonctionne. – Rob
Rob, je viens de tester le code ci-dessus dans un API22 AVD et ça marche très bien. Assurez-vous que votre contenu XML de préférence correspond à votre code. Pour l'exemple ci-dessus, SwitchPreference peut être n'importe où, mais vous avez besoin que les PreferenceCategorys soient des enfants directs de PreferenceScreen. – James
Je viens de recevoir la catégorie comme une préférence, pas de distribution, et l'ai enlevée. Travaillé. – Rob
Si vous souhaitez évaluer, et en fonction de ce masque, une alternative peut être/(Si deseas evaluar, y en base un ocultar de eso, una alternativa puede ser):
SwitchPreference autenticacionUsuario = (SwitchPreference) findPreference("key_autenticacion_usuario");
final EditTextPreference Username = (EditTextPreference) findPreference("key_username_mqtt");
final EditTextPreference Password = (EditTextPreference) findPreference("key_password_mqtt");
if (!autenticacionUsuario.isChecked()) {
PreferenceCategory preferenceCategory = (PreferenceCategory) findPreference("category_mqtt");
preferenceCategory.removePreference(Username);
preferenceCategory.removePreference(Password);
}
Tout cela doit être à l'intérieur/(Todo esto debe ir Dentro):
PrefsFragment de public static class étend PreferenceFragment {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Désolé, mais il s'agit d'un site en anglais. Pouvez-vous répondre en anglais? –
Bien sûr, mon intention était également de fournir des personnes qui ne parlent pas anglais –
@GustavoEduardoBelduma alors vous pourriez avoir besoin de lire ceci http://meta.stackoverflow.com/a/297680/545026 –
Voici une manière générique pour le faire qui fonctionne indépendamment du fait que la préférence est sous PreferenceCategory
ou PreferenceScreen
.
private void removePreference(Preference preference) {
PreferenceGroup parent = getParent(getPreferenceScreen(), preference);
if (parent == null)
throw new RuntimeException("Couldn't find preference");
parent.removePreference(preference);
}
private PreferenceGroup getParent(PreferenceGroup groupToSearchIn, Preference preference) {
for (int i = 0; i < groupToSearchIn.getPreferenceCount(); ++i) {
Preference child = groupToSearchIn.getPreference(i);
if (child == preference)
return groupToSearchIn;
if (child instanceof PreferenceGroup) {
PreferenceGroup childGroup = (PreferenceGroup)child;
PreferenceGroup result = getParent(childGroup, preference);
if (result != null)
return result;
}
}
return null;
}
Je recommande d'utiliser la préférence V7, il a la méthode setVisible(). Mais je ne l'ai pas encore essayé. Par conséquent, vous devez utiliser PreferenceFragment au lieu de PreferenceActivity https://developer.android.google.cn/reference/android/support/v7/preference/Preference.html#setVisible(boolean)
Dans votre fichier XML:
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android"
android:key="preferenceScreen">
<PreferenceCategory
android:key="personalisation"
android:title="your title here">
<ThemedPreference
android:key="animation" />
</PreferenceScreen>
Dans votre code:
PreferenceScreen pPreferenceScreen = (PreferenceScreen) findPreference("preferenceScreen");
PreferenceCategory pCategory = (PreferenceCategory) findPreference("personalisation");
ThemedPreference pThemePref = (ThemedPreference) findPreference("animation");
pPreferenceScreen.removePreference(pCategory); //remove category
pCategory.removePreference(pThemePref); // remove preference
- 1. Une préférence pour deux applications
- 2. Centrer une table verticalement de préférence CSS
- 3. Android: préférence Style de
- 4. android Préférence
- 5. php tri du tableau avec une préférence
- 6. Réagir à un clic sur une préférence
- 7. Android comment obtenir une préférence spécifique?
- 8. Javascript glissant (de préférence jQuery)
- 9. Problème de préférence booléenne Android
- 10. Largeur de barre de recherche dans une préférence personnalisée
- 11. Préférence partagée Android Édition
- 12. Préférence partagée Android
- 13. Tirer une préférence d'une mise en page de préférences xml
- 14. Comment obtenir une préférence pour la corrélation avec une variable?
- 15. Quelle clé de préférence pour définir la préférence de conformité du compilateur Java?
- 16. Remplacer le volet de préférence du système?
- 17. économie préférence de l'ordre dans SQL
- 18. Comment créer un attribut de préférence utilisateur?
- 19. Persistance du magasin de préférence Eclipse
- 20. onCreateView() appelé trop souvent, de préférence personnalisée
- 21. MySQL GROUP BY avec préférence
- 22. Comment détecter les modifications de préférence d'application
- 23. zone de liste déroulante Lier (JQuery préférence)
- 24. Préférence personnalisée sautant sur l'écran
- 25. Impossible de démarrer mon activité préférence
- 26. Enregistrer la préférence d'application Android
- 27. MySQL Ordre par symbole Préférence
- 28. Préférence de nommage: getSupportedModes() vs supportedModes()?
- 29. Valeur par défaut de la préférence Android
- 30. Éditeur JSON, de préférence pour Visual Studio
Je suis curieux de savoir aussi. –