getDefaultSharedPreferences上的NullPointerException

我正在基于开发人员指南创建一个PreferenceFragment ,但是当我尝试恢复保存的用户首选项时,我在onCreate()getDefaultSharedPreferences()调用中得到一个NullPointerException 。 我从xml中扩充了PreferenceFragment ,我也设置了默认值。 getDefaultSharedPreferencesName()中的getDefaultSharedPreferences()抛出exception。

这是PreferenceFragment类:

 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); } 

}

这是XML:

      

 Context context = getActivity(); 

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

getActivity()推迟到例如onCreate() (在onAttach()之后onAttach() )。

getActivity返回直到onAttach被调用。 更改

  SharedPreferences sharedPreferences = PreferenceManager .getDefaultSharedPreferences(context) 

  SharedPreferences sharedPreferences = PreferenceManager .getDefaultSharedPreferences(getActivity())