Android 如何正确应用onPreferenceChangeListener?
在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” 有关守则如下: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:尝试对
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应该指向相同的值