java - 根据Android中另一个Preference的值删除Preference
问题描述
我的问题是关于 Android 中的动态(共享)首选项。我进行了很多搜索,但找不到合适的解决方案。
我有一个应该根据它的值SwitchPreference
添加或删除一个。EditTextPreference
因此我有一个SettingsFragment.java类:
public class SettingsFragment extends PreferenceFragment implements SharedPreferences.OnSharedPreferenceChangeListener {
private static final String TAG = "SteuerApp Fragment";
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//Einsttelungsseite aus XML-Datei laden
addPreferencesFromResource(R.xml.preferences);
}
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
Log.v(TAG, "If-Schleife");
if(findPreference("industrial_tax").equals(false)){
Log.v(TAG, "If-Schleife");
Preference residence = findPreference("residence");
PreferenceScreen preferenceScreen = getPreferenceScreen();
preferenceScreen.removePreference(residence);
}
}
@Override
public void onResume() {
super.onResume();
getPreferenceManager().getSharedPreferences().registerOnSharedPreferenceChangeListener(this); //register SharedPreference
}
@Override
public void onPause() {
getPreferenceManager().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this); //unregister SharedPreference
super.onPause();
}
}
XML 布局文件如下所示:
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceCategory android:title="@string/calc_base">
...
<SwitchPreference
android:key="industrial_tax"
android:title="@string/industrial_tax"
android:visibility="invisible"/>
<EditTextPreference
android:defaultValue="0"
android:dialogTitle="@string/residence"
android:inputType="number"
android:key="residence"
android:title="@string/residence" />
...
</PreferenceCategory>
</PreferenceScreen>
我尝试调试,但它从未进入 if 子句,我无法弄清楚为什么......
不是SwitchPreference
二进制吗?我是 Android 新手,尽量不要不必要地打扰你们,但我真的走入了死胡同。
解决方案
findPreference()
返回一个Preference
对象(或null
)。
Preference
问题是您正在检查 this object 和boolean
value之间的相等性false
。该if
块永远不会被执行。
SwitchPreference
有isChecked()
方法(继承自TwoStatePreference
),您可能想改用它:
// get ahold of the SwitchPreference instance
SwitchPreference pref = (SwitchPreference) findPreference("industrial_tax");
// if it's not checked, then remove the corresponding Preference
if (!pref.isChecked()) {
Log.v(TAG, "If-Schleife");
Preference residence = findPreference("residence");
getPreferenceScreen().removePreference(residence);
}
此外,如果您可以禁用Preference
而不是删除它,那么使用该android:dependency
属性可能是一种更简单/更清洁的方法:
<SwitchPreference
android:key="industrial_tax"
android:title="@string/industrial_tax"
android:visibility="invisible"/>
<EditTextPreference
android:defaultValue="0"
android:dependency="industrial_tax"
android:dialogTitle="@string/residence"
android:inputType="number"
android:key="residence"
android:title="@string/residence" />
推荐阅读
- spring-boot - Double 值的 Spring ConfigurationProperties 验证
- python - 由于某些事件,例如按键或代码中的某些事件,控制台程序是否有任何方法可以更改其执行方式?
- ios - 暂停 UIViewPropertyAnimation 的问题
- reactjs - ReactJS 渲染多级 json 结构,无法显示二级数据
- spring - 在Java的POJO类中添加@Component或@Bean好不好?
- elasticsearch - 在elasticsearch中存储数据的正确方法是什么?
- javascript - 如何在 Javascript 中访问这些数据?
- timescaledb - 具有大型数据集的 timescaledb 的性能
- google-chrome - chrome是否会停止重定向的请求?
- grails - grailsApplication.config.grails.binRange 处的代码失败。任何人都可以解决这个问题?