とてもイライラします。次のコードで、PreferenceActivity クラスの設定取得で null を取得するのはなぜですか?
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をターゲットにしているので、非推奨の方法が使用されています。そして、以前は完全に正常に機能していました。