Existe-t-il un attribut XML qui fait exactement l'inverse de Android:dependency
?
Ce que je voudrais que la préférence dépendante soit activée lorsque l'autre n'est PAS cochée et désactivée lorsqu'elle IS cochée.
edit: peut-être que le problème ne vient pas de Android:dependency
, peut-être y at-il un attribut xml que je peux ajouter pour que la valeur par défaut de cette préférence soit désactivée, puis Android:dependency
le basculera de la manière opposée comme je le souhaite.
modifier à nouveau: j'ai essayé de définir Android:enabled="false"
dans les préférences et le désactive comme je le veux, mais même s'il dépend de l'autre préférence, il ne l'a pas activé comme je l'avais espéré.
En fait, je l'ai trouvé par moi-même et j'ai décidé de le poster ici pour aider les personnes qui pourraient avoir le même problème:
Android:disableDependentsState="true"
Mettez cela dans la préférence de contrôle.
Dmytro Zarezenko vous a demandé si vous vouliez que certaines dépendances soient activées lorsque la préférence dont elles dépendent est vraie et certaines autres lorsque cette préférence est fausse.
Utilisez la méthode décrite ci-dessus pour définir toutes les préférences dépendantes d'un type (quel que soit le nombre le plus élevé). Alors (avec la classe ayant implémentée OnSharedPreferenceChangeListener) avoir un code comme celui-ci dans le fragment d'activité et/ou de préférence:
@Override
public void onResume()
{
super.onResume();
sharedPreferences.registerOnSharedPreferenceChangeListener(this);
}
@Override
public void onPause()
{
super.onPause();
sharedPreferences.unregisterOnSharedPreferenceChangeListener(this);
}
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key)
{
if (key.equals("pref_that_they_depend-upon")
{
// Iterate over the preferences that need to be enabled or disabled,
// lets say there is just one called the_awkward_one.
Preference preference = findPreference("the_awkward_one");
// Or preference.setEnabled(! sharedPreferences.getBoolean(("pref_that_they_depend-upon", defaultValue));
preference.setEnabled(sharedPreferences.getBoolean(("pref_that_they_depend-upon", defaultValue));
}
}
Ceci est mon exemple de code pour le faire à partir de code et non de XML.
String eitherKey = "either";
String orKey = "or";
CheckBoxPreference either = new CheckBoxPreference(this);
either.setKey(eitherKey);
either.setTitle("Either");
either.setSummary("It is either one or");
either.setDefaultValue(false);
either.setDisableDependentsState(true);
inlinePrefCat.addPreference(either);
try
{
//Crossfade Time
CheckBoxPreference or = new CheckBoxPreference(this);
or.setKey(orKey);
or.setTitle("Or");
or.setSummary("the other");
inlinePrefCat.addPreference(or);
or.setDependency(eitherKey);
}
catch (Exception e)
{
}
Je dois modifier la valeur de la préférence dépendante. Je poste donc mon code ci-dessous, si quelqu'un souhaite le faire:
@Override
public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
if(preference.getKey().equals("key_a")) {
((CheckBoxPreference)findPreference("key_b").setChecked(false);
}
return super.onPreferenceTreeClick(preferenceScreen, preference);
}
Faites votre PreferenceActivity
implement
SharedPreferences.OnSharedPreferenceChangeListener
déclarer en PreferenceActivity
:
SharedPreferences prefs;
initialiser dans onCreate
:
SharedPreferences sPrefs = PreferenceManager.getDefaultSharedPreferences(this);
prefs = sPrefs;
et inscrivez-vous sur l'écouteur de changement de préférence partagé
prefs.registerOnSharedPreferenceChangeListener(this);
faites la même chose que Steve a dit dans les méthodes onResume
et onPause
.
implémentation de onSharedPreferenceChanged
auditeur:
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
Log.d("SettingsActivity","onSharedPreferenceChanged LISTENER FIRED");
if (key.equals(getString(R.string.key_call))) {
//if call true
if (sharedPreferences.getBoolean(getString(R.string.key_call), false)) {
Preference preference = findPreference(getString(R.string.key_record));
preference.setEnabled(false);
} else { // if call false
Preference preference = findPreference(getString(R.string.key_record));
preference.setEnabled(true);
}
}
if (key.equals(getString(R.string.key_record))) {
//if record true
if (sharedPreferences.getBoolean(getString(R.string.key_record), false)) {
Preference preference = findPreference(getString(R.string.key_call));
preference.setEnabled(false);
} else { // if record false
Preference preference = findPreference(getString(R.string.key_call));
preference.setEnabled(true);
}
}
}
Dans ce cas, j'ai deux préférences mutuellement exclusives dans PreferenceActivity
. Appeler et enregistrer. Lorsque les deux sont décochés, les deux peuvent être cochés, mais lorsque l'utilisateur en vérifie une, l'autre devient désactivée ( grisé). Lorsque l'utilisateur désélectionne la préférence cochée, il peut en vérifier une autre.
Sur les deux, d'autres préférences peuvent dépendre et cela peut être résolu avec l'attribut Android:dependancy
dans un fichier XML.