activity被回收后,点击Tab无法切换fragment

1、原因:当activity在后台并且内存不足时,系统会把activity给回收掉,但也会保存部分(不是全部)信息用于下次页面恢复。这样会导致下次进入页面后布局或数据错乱,并且点击底部Tab无法切换fragment。
2、解决方法:
(1)方法一:注释掉super.onSaveInstanceState(outState),这样被回收时就不会保存部分数据了,下次进来可以相当于首次进来一样,全部重新创建布局和价值数据,但这种方法略显粗糙,并且如果当前activity的初始化需要依赖前一个页面数据这样也不行。

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        //super.onSaveInstanceState(outState);
    }

(2)方法二:FragmentPagerAdapter里会有一个FragmentManager,当activity被缓存后FragmentManager里面的fragment部分信息也会被缓存,当下次进入activity后删除FragmentManager缓存的fragment,用新创建的fragment替换,这样就可以重新切换了。

    /**
     * 重新初始化所有fragments
     */
    private void reinitFragments() {
        isNeedReinitFragments = true;
        fragments.clear();
        initFragments();
        homeViewPagerAdapter.notifyDataSetChanged();
    }

	class HomeViewPagerAdapter extends FragmentPagerAdapter {

		... ... //省略其他方法
		
        @Override
        public int getItemPosition(Object object) {
            if (isNeedReinitFragments) {
                return POSITION_NONE;
            }
            return super.getItemPosition(object);
        }
        
        @Override
        public Object instantiateItem(ViewGroup container, int position) {
            Fragment fragment = (Fragment) super.instantiateItem(container, position);
            String tag = fragment.getTag();
            //用于activity内存不足时,重新初始化所有fragment
            if (isNeedReinitFragments) {
                FragmentTransaction transaction = fm.beginTransaction();
                transaction.remove(fragment);
                fragment = fragments.get(position);
                transaction.add(container.getId(),fragment,tag);
                transaction.attach(fragment);
                transaction.commitAllowingStateLoss();
            }
            return fragment;
        }
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值