web-dev-qa-db-fra.com

Comment faire en face de de l'attribut de préférence Android: dépendance?

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é.

62
brybam

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.

126
brybam

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));
    }
}
8
Steve Waring

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)
  {
  }
1
Justin

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);
}
0
davidm

Faites votre PreferenceActivityimplement 

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.

0
Primož Majhen