如何正确应用onPreferenceChangeListener?

the*_*ero 1 android

在关于修改SettingsActivity 的Udacity Android开发视频中,我按照这个要点实现了代码但是在Android Monitor上收到错误说

03-18 10:52:59.625:E/AndroidRuntime(2520):java.lang.RuntimeException:无法启动活动ComponentInfo {com.example.android.sunshine/com.example.android.sunshine.SettingsActivity}:java.lang .NullPointerException:尝试在空对象引用上调用虚方法'void android.preference.Preference.setOnPreferenceChangeListener(android.preference.Preference $ OnPreferenceChangeListener)'

相关代码是

   private void bindPreferenceSummaryToValue(Preference preference) {
    // Set the listener to watch for value changes.
    preference.setOnPreferenceChangeListener(this);

    // Trigger the listener immediately with the preference's
    // current value.
    onPreferenceChange(preference,
            PreferenceManager
                    .getDefaultSharedPreferences(preference.getContext())
                    .getString(preference.getKey(), ""));
}
Run Code Online (Sandbox Code Playgroud)

所以它看起来this是未定义的,是吗?

Neo*_*Neo 5

preference传递在这种情况下空.真正的罪魁祸首可能是您编写引用的XML布局文件中缺少的条目.

找到它的简单方法是查看堆栈跟踪,并从您SettingsActivity或其中被引用的Activity中查看它所调用的字段.例如:

bindPreferenceSummaryToValue(findPreference("mytypes"));
Run Code Online (Sandbox Code Playgroud)

看看enabled上面的情况是否正在添加到您的布局中,如下所示:

<ListPreference
   android:entries="@array/pref_my_types"
   android:entryValues="@array/pref_my_values"
   android:key="mytypes"
   android:title="MyTypes"/>
Run Code Online (Sandbox Code Playgroud)

如果缺少它,它将抛出一个NPEfindPreference("mytypes")返回null.