如何做偏好属性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在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
有两个互斥的PreferenceActivity
。 呼叫和logging。 如果两者都未选中,则可以检查两者,但是当用户检查其中一个时,另一个变为禁用(变灰)。 当用户取消选中的选项时,用户可以检查另一个。
在他们两个上,其他偏好可以依赖,并且可以用android:dependancy
在XML文件中的android:dependancy
属性来解决。