Android中getActivity()为null的解决办法

xiaoxiao2021-02-28  77

在Android开发中,在使用Fragment时,不管是用support v7中的ActionBarActivity,还是在SDk version 21出现的AppCompatActivity,都是继承自FragmentActivity,在应用被切换到后台的时候,Activity可能被回收,在回收之前都会执行FragmentActivity中的onSaveInstanceState方法保存所有Fragment的状态,如下所示。下面是FragmentActivity的部分源码:

/** * Save all appropriate fragment state. */ @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); Parcelable p = mFragments.saveAllState(); if (p != null) { outState.putParcelable(FRAGMENTS_TAG, p); } }

,重新启动该activity时系统会恢复之前被回收的Activity,这个时候FragmentActivity在onCreate里面也会做Fragment的恢复。

/** * Perform initialization of all fragments and loaders. */ @SuppressWarnings("deprecation") @Override protected void onCreate(@Nullable Bundle savedInstanceState) { mFragments.attachHost(null /*parent*/); super.onCreate(savedInstanceState); NonConfigurationInstances nc = (NonConfigurationInstances) getLastNonConfigurationInstance(); if (nc != null) { mFragments.restoreLoaderNonConfig(nc.loaders); } if (savedInstanceState != null) { Parcelable p = savedInstanceState.getParcelable(FRAGMENTS_TAG); mFragments.restoreAllState(p, nc != null ? nc.fragments : null); } mFragments.dispatchCreate(); }

这里我的解决方法是在恢复Fragment之前把保存Bundle里面的数据给清除。赶在Activity恢复其之前所绑定的Fragment之前清除所有存储在savedInstanceState中的信息。方法如下:

if (savedInstanceState != null) { savedInstanceState.putParcelable("android:support:fragments", null); //或者 //String FRAGMENTS_TAG = "Android:support:fragments"; // remove掉保存的Fragment // savedInstanceState.remove(FRAGMENTS_TAG); } super.onCreate(savedInstanceState); activity中 @Override protected void onSaveInstanceState(Bundle outState) { //super.onSaveInstanceState(outState); }

第二种 fragment

@Override public void onAttach(Activity activity) { super.onAttach(activity); mCtx = activity;//mCtx 是成员变量,上下文引用 } @Override public void onDetach() { super.onDetach(); mCtx = null; }
转载请注明原文地址: https://www.6miu.com/read-41330.html

最新回复(0)