getDefaultSharedPreferences上的NullPointerException

时间:2014-04-12 19:30:00

标签: java android sharedpreferences

我是根据开发人员指南创建PreferenceFragment但是当我尝试恢复已保存的用户时,我在NullPointerException的{​​{1}}电话中获得了getDefaultSharedPreferences()喜好。我从xml中膨胀onCreate(),我也设置了默认值。 PreferenceFragment内的getDefaultSharedPreferencesName()会抛出异常。

以下是getDefaultSharedPreferences()类:

PreferenceFragment

}

这是XML:

public class SettingsFragment extends PreferenceFragment implements
    OnSharedPreferenceChangeListener {

public static final String KEY_MAX_WALK_DISTANCE_PREFERENCE = "max_walk_distance_preference";
public static final String KEY_MAX_SEARCH_TIME_PREFERENCE = "max_search_time_preference";

Context context = getActivity();

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // Load the preferences from an XML resource
    addPreferencesFromResource(R.xml.preferences);

    // load user preferences
    SharedPreferences sharedPreferences = PreferenceManager
            .getDefaultSharedPreferences(context);
    if (sharedPreferences != null) {
        Preference walkDistance = findPreference(KEY_MAX_WALK_DISTANCE_PREFERENCE);
        if (walkDistance != null) {
            walkDistance.setSummary(sharedPreferences.getString(
                    KEY_MAX_WALK_DISTANCE_PREFERENCE, "")
                    + getResources().getString(
                            R.string.max_walk_distance_postfix));
        }
        Preference searchTime = findPreference(KEY_MAX_SEARCH_TIME_PREFERENCE);
        if (searchTime != null) {
            searchTime.setSummary(sharedPreferences.getString(
                    KEY_MAX_SEARCH_TIME_PREFERENCE, "")
                    + getResources().getString(
                            R.string.max_search_time_postfix));
        }
    }
}

@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences,
        String key) {
    if (key.equals(KEY_MAX_WALK_DISTANCE_PREFERENCE)) {
        Preference walkDistance = findPreference(key);
        // Set summary to be the user-description for the selected value
        walkDistance.setSummary(sharedPreferences.getString(key, "")
                + getResources().getString(
                        R.string.max_walk_distance_postfix));
    } else if (key.equals(KEY_MAX_SEARCH_TIME_PREFERENCE)) {
        Preference searchTime = findPreference(key);
        // Set summary to be the user-description for the selected value
        searchTime.setSummary(sharedPreferences.getString(key, "")
                + getResources()
                        .getString(R.string.max_search_time_postfix));
    }
}

@Override
public void onResume() {
    super.onResume();
    getPreferenceScreen().getSharedPreferences()
            .registerOnSharedPreferenceChangeListener(this);
}

@Override
public void onPause() {
    super.onPause();
    getPreferenceScreen().getSharedPreferences()
            .unregisterOnSharedPreferenceChangeListener(this);
}

2 个答案:

答案 0 :(得分:6)

Context context = getActivity();

当实例化对象并且getActivity()返回null时,您的片段与任何活动都没有关联。因此NPE在尝试使用null Context获取首选项时。

getActivity()推迟到例如您的onCreate()(在onAttach()之后调用)。

答案 1 :(得分:1)

getActivity返回,直到调用onAttach。变化

 SharedPreferences sharedPreferences = PreferenceManager
            .getDefaultSharedPreferences(context)

 SharedPreferences sharedPreferences = PreferenceManager
            .getDefaultSharedPreferences(getActivity())