android - 如何正确应用 onPreferenceChangeListener?

标签 android

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/

相关文章:

java - 获取Android中对象的所有数据

android - android是否保存静态变量?

android - 在 RecyclerView 的第一个索引处添加项目后,如何保持在滚动位置?

java - 按照拍摄图像的顺序从图库加载图像?

java - 使用 PendingIntent 停止服务

Android - 检测与特定 wifi ssid 断开连接的正确方法?

java - 如何在 Android 中处理长按

android - 将 Cordova 迁移到电容器 - 错误 : package android. support.v4.content 不存在

android - 在Android中将Unity加载为 subview 时调用场景

android - 缩放时更改 ImageView 的大小