Android 如何正确应用onPreferenceChangeListener?

Android 如何正确应用onPreferenceChangeListener?,android,Android,在on Modifying SettingsActivity中,我按照实现了代码,但在Android监视器上出现了一个错误 03-18 10:52:59.625:E/AndroidRuntime2520:java.lang.RuntimeException:无法启动活动组件信息{com.example.android.sunshine/com.example.android.sunshine.SettingsActivity}:java.lang.NullPointerException:尝试对

在on Modifying SettingsActivity中,我按照实现了代码,但在Android监视器上出现了一个错误

03-18 10:52:59.625:E/AndroidRuntime2520:java.lang.RuntimeException:无法启动活动组件信息{com.example.android.sunshine/com.example.android.sunshine.SettingsActivity}:java.lang.NullPointerException:尝试对空对象引用调用虚拟方法“void android.preference.preference.SetOnPreferenceChangeListenerRoid.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(), ""));
}

看起来这是未定义的,对吗?

认为您的首选项对象更可能为空。在本例中,“this”是指运行bindPreferenceSummaryToValuePreference的活动,因此它不能为null。将断点设置为直线:

preference.setOnPreferenceChangeListener(this);

当您运行调试时,您将能够确定哪个是空的。

认为您的首选项对象更可能是空的。在本例中,“this”是指运行bindPreferenceSummaryToValuePreference的活动,因此它不能为null。将断点设置为直线:

preference.setOnPreferenceChangeListener(this);
运行调试时,您将能够确定哪个参数为null。

在这种情况下,传递的首选项为null。 真正的罪魁祸首可能是代码引用的XML布局文件中缺少条目

找到它的简单方法是查看堆栈跟踪,并从设置活动或引用它的某些活动中查看调用它的字段。 例如:

bindPreferenceSummaryToValue(findPreference("mytypes"));
查看是否将在上述情况下启用的内容添加到布局中,如下所示:

<ListPreference
   android:entries="@array/pref_my_types"
   android:entryValues="@array/pref_my_values"
   android:key="mytypes"
   android:title="MyTypes"/>
如果缺少,它将抛出一个NPE,findPreferencemytypes将返回null。

在这种情况下,传递的首选项为null。 真正的罪魁祸首可能是代码引用的XML布局文件中缺少条目

找到它的简单方法是查看堆栈跟踪,并从设置活动或引用它的某些活动中查看调用它的字段。 例如:

bindPreferenceSummaryToValue(findPreference("mytypes"));
查看是否将在上述情况下启用的内容添加到布局中,如下所示:

<ListPreference
   android:entries="@array/pref_my_types"
   android:entryValues="@array/pref_my_values"
   android:key="mytypes"
   android:title="MyTypes"/>

如果缺少此项,它将抛出NPE,findPreferencemytypes将返回null。

EditTextPreference中的键应与bindPreferenceSummaryToValue中的键匹配

   <EditTextPreference
       android:key="@string/pref_location_key"
       android:title="@string/pref_location_label"
       android:defaultValue="@string/pref_default_display_name"
       android:selectAllOnFocus="true"
       android:inputType="textCapWords"
       android:capitalize="words"
       android:singleLine="true"
       android:maxLines="1" /> 
以及我在BindPreferenceSummary中传递给ValueFindReferenceGetStringr.string.pref_location_key的键;
Android:key-value和bindPreferenceSummaryToValue应指向相同的。EditTextPreference中的键应与bindPreferenceSummaryToValue中的键匹配

   <EditTextPreference
       android:key="@string/pref_location_key"
       android:title="@string/pref_location_label"
       android:defaultValue="@string/pref_default_display_name"
       android:selectAllOnFocus="true"
       android:inputType="textCapWords"
       android:capitalize="words"
       android:singleLine="true"
       android:maxLines="1" /> 
以及我在BindPreferenceSummary中传递给ValueFindReferenceGetStringr.string.pref_location_key的键; Android:key value和bindPreferenceSummaryToValue应该指向相同的值