[英]How to properly apply onPreferenceChangeListener?
在有關修改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(), ""));
}
看來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"/>
如果缺少此findPreference("mytypes")
,它將拋出NPE
並且findPreference("mytypes")
將返回null。
認為您的Preference對象為null的可能性更大。 在這種情況下,“ this”是指正在運行bindPreferenceSummaryToValue(Preference)的Activity,因此它不能為null。 在該行上設置一個斷點:
preference.setOnPreferenceChangeListener(this);
並且您可以在運行debug時確定哪個為空。
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" />
以及我在bindPreferenceSummaryToValue(findPreference(getString(R.string.pref_location_key)));
傳遞的密鑰bindPreferenceSummaryToValue(findPreference(getString(R.string.pref_location_key)));
Android:鍵值和bindPreferenceSummaryToValue應該指向相同。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.