Java 如何与android的偏好属性相反:依赖性?
是否存在与android:dependency完全相反的XML属性 我希望在未选中其他首选项时启用从属首选项,并在选中该首选项时禁用它 编辑:也许问题不在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
将以我想要的相反方式切换它
再次编辑:
我尝试在首选项中设置
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”)。