Как сделать противоположность атрибута предпочтения android: зависимость?

есть ли атрибут XML, который делает полную противоположность android:dependency?

что я хотел бы, чтобы зависимое предпочтение было включено, когда другое не проверено и отключено, когда оно проверено.

edit: возможно, проблема не в android:dependency возможно, есть атрибут xml, который я могу добавить, чтобы сделать значение по умолчанию для этого предпочтения отключенным, а затем android:dependency переключит его в противоположную сторону, как я хочу.

изменить еще раз: Я попытался установить android:enabled="false" в предпочтение и он отключает его, как я хочу, но даже с его зависимостью от другого предпочтения он не включил его, как я надеялся

5 ответов


на самом деле нашел его самостоятельно и решил, что я просто опубликую его здесь, чтобы помочь всем, у кого может быть такая же проблема:

android:disableDependentsState="true"

поместите это в предпочтение управления.


Дмитрий Зарезенко спросил, что, если вы хотите, чтобы некоторые зависимости были включены, когда предпочтение, от которого они зависят, истинно, а некоторые-когда это предпочтение ложно.

используйте метод, описанный выше, чтобы установить все зависимые предпочтения одного типа (которые когда-либо имели большее число). Затем (с классом, имеющим реализации OnSharedPreferenceChangeListener) имеют код, подобный этому в активности предпочтения и / или фрагменте предпочтения:

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

Это мой пример кода для этого из кода, а не 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)
  {
  }

Мне нужно изменить значение зависимого предпочтения, поэтому я размещаю свой код ниже, если кто-то хочет это сделать:

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

сделать свой PreferenceActivity implement

SharedPreferences.OnSharedPreferenceChangeListener

объявить в PreferenceActivity:

SharedPreferences prefs;

инициализации в onCreate:

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

и зарегистрируйтесь на прослушивателе изменения общих предпочтений

prefs.registerOnSharedPreferenceChangeListener(this);

сделайте то же самое, что сказал Стив в onResume и onPause методы.

реализация onSharedPreferenceChanged слушатель:

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

в этом случае, у меня есть 2 взаимоисключающих Настройки в PreferenceActivity. Звонок и запись. Когда оба не отмечены, оба могут быть проверены, но когда пользователь проверяет один из них, другой становится отключенным (серым). По мере того как пользователь снимает флажок, пользователь может проверить другой.

от обоих из них могут зависеть другие предпочтения, и это может быть разработано с android:dependancy атрибут в XML-файле.