如何做偏好属性android:依赖?

有没有XML的属性,完全相反的android:dependency

我想要的依赖首选项被启用时,其他没有选中和禁用时,它被选中。

编辑:也许这个问题是不是与android:dependency也许有一个xml属性,我可以添加,以使该偏好的默认禁用,然后android:dependency将按照我想要的相反的方式切换它。

再次编辑:我试图在首选项中设置android:enabled="false" ,它会像我想要的那样禁用它,但即使依赖于其他首选项,它也不会像我所希望的那样启用它

实际上,我自己发现它,并认为我只是在这里发布,以帮助任何人可能有这个相同的问题:

 android:disableDependentsState="true" 

把它放在控制偏好中。

Dmytro Zarezenko问,如果您希望某些依赖关系在其所依赖的首选项为true时启用,并且在首选项为false时启用某些依赖项。

使用上面描述的方法来设置一个types的所有依赖首选项(哪个具有更大的数字)。 然后(在实现了OnSharedPreferenceChangeListener的类中)在Preference Activity和/或Preference Fragment中有这样的代码:

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

和Steve在onResumeonPause方法中所说的一样。

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有两个互斥的PreferenceActivity 。 呼叫和logging。 如果两者都未选中,则可以检查两者,但是当用户检查其中一个时,另一个变为禁用(变灰)。 当用户取消选中的选项时,用户可以检查另一个。

在他们两个上,其他偏好可以依赖,并且可以用android:dependancy在XML文件中的android:dependancy属性来解决。