簡體   English   中英

如何正確應用onPreferenceChangeListener?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM