在Udacity Android development video在修改 SettingsActivity 时,我根据 this gist 实现了代码但我在 Android Monitor 上收到一条错误消息
03-18 10:52:59.625: E/AndroidRuntime(2520): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.android.sunshine/com.example.android.sunshine.SettingsActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.preference.Preference.setOnPreferenceChangeListener(android.preference.Preference$OnPreferenceChangeListener)' on a null object reference
相关代码为
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(), ""));
}
所以看起来 this
是未定义的,对吗?
最佳答案
在这种情况下,传递的 preference
为 null。
真正的罪魁祸首可能是您在代码中引用的XML 布局中缺少条目 文件。
从您的 SettingsActivity
或引用它的某个 Activity 中,查看堆栈跟踪并查看正在调用哪个字段是找到它的简单方法。
例如:
bindPreferenceSummaryToValue(findPreference("mytypes"));
查看上面案例中的 enabled
是否被添加到您的布局中,如下所示:
<ListPreference
android:entries="@array/pref_my_types"
android:entryValues="@array/pref_my_values"
android:key="mytypes"
android:title="MyTypes"/>
如果缺少它,它将抛出一个 NPE
并且 findPreference("mytypes")
将返回 null。
关于android - 如何正确应用 onPreferenceChangeListener?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29113430/