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

以下所说都是保存视图状态(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);
    }

你可能感兴趣的:(UI,fragment保存)