即使在onAttach()中设置,片段中的空活动也是如此

时间:2018-02-01 17:07:19

标签: android android-activity nullpointerexception fragment

我的代码如下:

(注意:请注意底部的行,我会收到NullPointerException的报告。此外,这个帖子已经过大量编辑,但我相信所有相关的代码都包括在内)

public class SettingsFragment extends PreferenceFragment implements SharedPreferences.OnSharedPreferenceChangeListener {

     public SettingsActivity activity;

     @Override
     public void onAttach(Context context) {
         super.onAttach(context);

         if (context instanceof Activity) {
             activity = (SettingsActivity) context;
         }
     }

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

         addPreferencesFromResource(R.xml.preferences);

         final SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(getActivity());
     }


     @Override
     public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String prefKey) {

         // The line below gets many NullPointerException reports
         SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(activity);
     }
 }

我认为在activity中设置onAttach()变量几乎可以确保它不为空。 (而不是使用getActivity()

我拥有getActivity()的实例有0个报告永远为空。我似乎只需要使用它。 但我想知道活动是如何为空并将其更改为getActivity()的方式?

FWIW,我在这堂课中没有使用onDetach()

只是一个猜测:在我看来onAttach()可以在调用onSharedPreferenceChanged()之前调用好,所以那时候activity可能会变为空?

activity变量总是存在null变量的可能性,而且该行中还有其他内容,但这似乎对我来说最明显?

1 个答案:

答案 0 :(得分:0)

你应该使用

@Override
public void onAttach (Activity activity) {
    super.onAttach(activity)
}

代替

@Override
public void onAttach (Context context) {
    super.onAttach(context)
} 

虽然第一个函数已被弃用但它仍然可以正常工作。试试吧。