当前位置: 代码迷 >> 综合 >> Iwfu-保存Fragment切换时的UI状态/保存销毁Activity后再次进入的视图状态
  详细解决方案

Iwfu-保存Fragment切换时的UI状态/保存销毁Activity后再次进入的视图状态

热度:42   发布时间:2023-12-19 02:14:24.0

以下所说都是保存视图状态(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@Overridepublic 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位置

@Overrideprotected 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);}
  相关解决方案