这太令人沮丧了。为什么在下面的代码中我的 PreferenceActivity 类中的首选项检索为空?
private void setupSpecialPrefClickListener(SettingsSystem settingsSystem) {
Map<String,?> keys = PreferenceManager.getDefaultSharedPreferences(this).getAll();
for(Map.Entry<String,?> entry : keys.entrySet()){
String key = entry.getKey();
if( key.startsWith("d_")) {
Preference p = findPreference((CharSequence)key);
//p == NULL!!!!!
p.setOnPreferenceClickListener(this);
}
}
}
找到并传递的首选项名称是现有首选项的完全合法名称(“d_lightSensorLimit” - 与地图中第一个匹配并导致异常的确切名称)。之前构造函数中的纯文本字符串提取得非常好。这个方法也是从构造函数调用的(用这个方法的调用替换了巨大的条目列表):
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.settings_system);
getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);
setupSpecialPrefClickListener(this);
}
根据人们的要求,这里是 settings_system.xml 的相关摘录:
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >
<Preference
android:defaultValue="0"
android:dialogTitle="Night mode on lux (0-disable)"
android:inputType="phone"
android:key="d_lightSensorLimit"
android:layout="@layout/pref"
android:title="Automatic nightmode" />
</PreferenceScreen>
我的目标是 2.1,因此不推荐使用的方法也是如此。它以前工作得很好。