Как сделать противоположность предпочтения атрибута Android: зависимость? - PullRequest
62 голосов
/ 28 августа 2010

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

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

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

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

Ответы [ 5 ]

126 голосов
/ 28 августа 2010

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

android:disableDependentsState="true"

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

8 голосов
/ 15 мая 2013

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

Используйте метод, описанный выше, чтобы установить всезависимые предпочтения одного типа (которые когда-либо имеют большее число).Затем (с классом, имеющим реализации 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));
    }
}
1 голос
/ 15 декабря 2011

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

Заставьте 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.

0 голосов
/ 21 марта 2014

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

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