以下所说都是保存视图状态(UI状态),并不保存具体数据.
1-保存Fragment切换时的UI状态:
思路是:由于每次销毁然后重进Fragment会调用onCreateView创建一个新的 View对象,导致所有视图都销毁重建,所以我们自己保存一个静态的View对象,这样每次切换和退出到桌面后再次进入也会返回退出时的状态。
自定义Fragment,
public class MyBaseFragment extends Fragment {
/*
* 保证每次只有一个Fragment实例,子Fragment在onCreateView里加上这个方法
*
* @param inflater 布局填充器
*
* @param container 父布局
*
* @param viewLayoutId 本fragment对应的布局文件
*/
protected View justOneFragment(LayoutInflater inflater,
ViewGroup container,View view, int viewLayoutId) {
// 防止fragment重复创建,保存退出fragment时的UI状态
if (view == null) {
view = inflater.inflate(viewLayoutId, container, false);
}
ViewGroup parent = (ViewGroup) view.getParent();
// 如果view已经被加到Activity中,则从中移除
if (parent != null) {
parent.removeView(view);
}
return view;
}
}
然后子Fragment继承这个自定义的MyBaseFragment
public class Fragment1 extends MyBaseFragment {
// 将本Fragment的View设置成static,以达到按回退键后销毁fragment,再次进入app,显示上一次退出时fragment状态的效果
// 但这个方法只能保存UI界面的状态,不可真正保存数据
private static View view1;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater,
@Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
view1 = justOneFragment(inflater, container, view1, R.layout.fragment1);
return view1;
}
}
2–保存销毁Activity后再次进入的视图状态
将FragmentTabHost设置为静态的,保证再次进入使用的是同一个tabHost
// 定义FragmentTabHost对象
private static FragmentTabHost mTabHost;
// Activity销毁时tab的位置
private static int currentTab;
activity销毁时保存退出时,tabhost选中的tab位置
@Override
protected void onDestroy() {
super.onDestroy();
currentTab = mTabHost.getCurrentTab();
Log.d("save", "ondestory---main--" + currentTab);
Log.d("save", "ondestory---main--" + mTabHost);
}
每次进入时就设置进入的页面与上次退出时相同
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.d("save", "oncreate---main---" + currentTab);
Log.d("save", "oncreate---main--" + mTabHost);
initView();
mTabHost.setCurrentTab(currentTab);
}