Iwfu-保存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);
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值