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

来源:互联网 发布:凉凉网络用语 编辑:程序博客网 时间:2024/05/21 18:38

以下所说都是保存视图状态(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);    }
0 0
原创粉丝点击