Java 如何与android的偏好属性相反:依赖性?

Java 如何与android的偏好属性相反:依赖性?,java,android,xml,dependencies,preferences,Java,Android,Xml,Dependencies,Preferences,是否存在与android:dependency完全相反的XML属性 我希望在未选中其他首选项时启用从属首选项,并在选中该首选项时禁用它 编辑:也许问题不在android:dependency上,也许我可以添加一个xml属性来禁用该首选项的默认值,然后android:dependency将以我想要的相反方式切换它 再次编辑: 我尝试在首选项中设置android:enabled=“false”,它会像我所希望的那样禁用它,但即使它依赖于其他首选项,它也不会像我希望的那样启用它,因为它实际上是我自己发

是否存在与android:dependency完全相反的XML属性

我希望在未选中其他首选项时启用从属首选项,并在选中该首选项时禁用它

编辑:也许问题不在
android:dependency
上,也许我可以添加一个xml属性来禁用该首选项的默认值,然后
android:dependency
将以我想要的相反方式切换它

再次编辑:
我尝试在首选项中设置
android:enabled=“false”
,它会像我所希望的那样禁用它,但即使它依赖于其他首选项,它也不会像我希望的那样启用它,因为它实际上是我自己发现的,我想我只是将它发布在这里,以帮助可能有相同问题的任何人:

android:disableDependentsState="true"

将其放在控制首选项中。

这是我的代码示例,用于从代码而不是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)
  {
  }

Dmytro Zarezenko问,如果您希望某些依赖项在其所依赖的首选项为true时启用,而某些依赖项在该首选项为false时启用,该怎么办

使用上面描述的方法设置一种类型的所有从属首选项(具有更大的数量)。然后(类具有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));
    }
}

我需要更改dependent preference的值,所以如果有人想这样做,我会在下面发布我的代码:

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

让您的
首选项活动
实现

SharedReferences.OnSharedPreferenceChangeListener

首选项活动中声明

SharedReferences优先权

在创建时初始化:

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

并在共享首选项更改侦听器上注册

prefs.registerOnSharedPreferenceChangeListener(this);
按照Steve在
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);
        }
    }
}
在本例中,我在
PreferenceActivity
中有两个互斥的首选项。 打电话录音。 如果两者都未选中,则可以同时选中,但当用户选中其中一个时,另一个将被禁用(灰显)。 当用户取消选中选中的首选项时,用户可以选中另一个首选项


在这两种情况下,可以根据其他首选项进行选择,这可以通过XML文件中的
android:dependency
属性来确定。

confirm。。将这一行添加到您在android:dependency:)中的首选项中,更清楚地说:将这一行添加到您的首选项所依赖的首选项上。文档说:“导致依赖项被禁用的状态(true表示打开,false表示关闭)。但是如果我想启用一些pref并禁用一些pref,则取决于一个复选框pref?完美!对于更明显的“将其置于控制首选项中”意味着,在SwitchPreference(Master)中添加android:disableDependentsState=“true”代码,这会影响其他(从属)IMHO,Steve Waring的解决方案更可取,因为无论是什么原因导致首选项值发生变化,它都能工作。也就是说,如果在代码中设置“key_a”,Waring的解决方案将生效,而这里的解决方案不会生效(因为没有“click”)。