webentwicklung-frage-antwort-db.com.de

Wie mache ich das Gegenteil von Präferenzattribut Android: Abhängigkeit?

Gibt es ein XML-Attribut, das das genaue Gegenteil von Android:dependency bewirkt?

Was ich möchte, ist, dass die abhängige Einstellung aktiviert ist, wenn die andere NICHT aktiviert ist, und deaktiviert, wenn sie IS aktiviert ist.

bearbeiten: Möglicherweise liegt das Problem nicht bei Android:dependency. Möglicherweise gibt es ein XML-Attribut, das ich hinzufügen kann, um die Standardeinstellung für diese Voreinstellung zu deaktivieren. Dann wird Android:dependency die entgegengesetzte Einstellung wie gewünscht aktivieren.

nochmals bearbeiten: Ich habe versucht, Android:enabled="false" in der Voreinstellung zu setzen, und es deaktiviert es, wie ich es möchte, aber obwohl es von der anderen Voreinstellung abhängt, hat es es nicht aktiviert, wie ich es mir erhofft hatte

62
brybam

Eigentlich fand ich es alleine und dachte mir, ich würde es hier posten, um jedem zu helfen, der das gleiche Problem hat:

Android:disableDependentsState="true"

Setzen Sie das in die kontrollierende Präferenz.

126
brybam

Dmytro Zarezenko hat gefragt, ob einige Abhängigkeiten aktiviert werden sollen, wenn die Präferenz, von der sie abhängig sind, wahr ist, und einige, die aktiviert werden sollen, wenn diese Präferenz falsch ist.

Verwenden Sie die oben beschriebene Methode, um alle abhängigen Präferenzen eines Typs festzulegen (die jeweils die größere Nummer haben). Dann (wenn die Klasse OnSharedPreferenceChangeListener implementiert hat) haben Sie folgenden Code in der Präferenzaktivität und/oder im Präferenzfragment:

@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

Dies ist mein Codebeispiel, um dies aus Code und nicht aus XML auszuführen.

  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

Ich muss den Wert der abhängigen Präferenzen ändern, daher poste ich meinen Code, wenn jemand dies tun möchte:

@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

Machen Sie Ihre PreferenceActivityimplement 

SharedPreferences.OnSharedPreferenceChangeListener

in PreferenceActivity deklarieren:

SharedPreferences prefs;

in onCreate initialisieren:

SharedPreferences sPrefs = PreferenceManager.getDefaultSharedPreferences(this); prefs = sPrefs;

und registrieren Sie sich bei einem Listener für gemeinsam genutzte Voreinstellungen

prefs.registerOnSharedPreferenceChangeListener(this);

machen Sie dasselbe, was Steve in den Methoden onResume und onPause gesagt hat.

implementierung von onSharedPreferenceChanged Listener:

@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);
        }
    }
}

In diesem Fall habe ich zwei gegenseitig ausschließende Voreinstellungen in PreferenceActivity. Call and Record. Wenn beide nicht markiert sind, können beide geprüft werden. Wenn der Benutzer jedoch eine davon überprüft, wird die andere deaktiviert ( ausgegraut). Wenn der Benutzer die markierte Einstellung deaktiviert, kann der Benutzer die andere prüfen.

Von beiden können andere Einstellungen abhängen, die mit dem Android:dependancy-Attribut in der XML-Datei ermittelt werden können.

0
Primož Majhen