2014-04-12 56 views
4

我正在根据开发人员指南创建PreferenceFragment,但当我尝试恢复保存的用户首选项时,我在调用中获得NullPointerException调用onCreate()。我从xml给PreferenceFragment充气,我也设置了默认值。在getDefaultSharedPreferences()之内getDefaultSharedPreferencesName()抛出异常。getDefaultSharedPreferences上的NullPointerException

这里是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:

<?xml version="1.0" encoding="utf-8"?> 
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" > 

<EditTextPreference 
    android:dialogTitle="@string/max_walk_distance_dialogtitle" 
    android:key="max_walk_distance_preference" 
    android:summary="@string/max_walk_distance_summary" 
    android:title="@string/max_walk_distance_title" 
    android:inputType="number" 
    android:defaultValue="500" /> 

<EditTextPreference 
    android:dialogTitle="@string/max_search_time_dialogtitle" 
    android:key="max_search_time_preference" 
    android:summary="@string/max_search_time_summary" 
    android:title="@string/max_search_time_title" 
    android:inputType="number" 
    android:defaultValue="10"/> 

</PreferenceScreen> 

回答

6
Context context = getActivity(); 

您的片段时,对象实例化和getActivity()回报null不与任何活动相关。因此,NPE在尝试使用空值Context获得偏好时。

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

1

getActivity回报,直到onAttach被调用。更改

SharedPreferences sharedPreferences = PreferenceManager 
      .getDefaultSharedPreferences(context) 

SharedPreferences sharedPreferences = PreferenceManager 
      .getDefaultSharedPreferences(getActivity()) 
相关问题