从一个activity跳转到一个已存在activity的指定fragment中

最近在项目中碰到这个需求,因为要跳转到指定的fragment中,因此需要携带数据。

在网上搜索了一番,没找到有用的信息,于是就扩大范围。先解决跳转到已存在的activity中,于是就需要复写一个activity中的方法。

@Override
protected void onNewIntent(Intent intent) {
// 拦截Intent,做相应处理
}

通过实践,运行后发现了闪屏退出,查看了下日志,原因是IllegalStateException: Can not perform this action after onSaveInstanceState。

首先我们需要弄清楚onSaveInstanceState方法是在什么时候会被调用,当该Activity即将被销毁前或者按home键退出时调用,来保存Activity数据的,如果在保存玩状态后,桌面通过其他方式启动程序且需要进行Fragment的入栈或弹栈操作就会出错。桌面其他方式如widget、悬浮窗、通知状态栏等方式通过Intent启动程序。

如果在这里拦截了Intent进行Fragment的添加和弹栈就会报错:IllegalStateException: Can not perform this action after onSaveInstanceState。不能在onSaveInstanceState之后立即进行这些操作。

因此我们需要先定义一个intent 保存onNewIntent()方法中的intent。然后在onResume() 方法中进行相应的处理。

部分源码如下:

private Intent  homeIntent;


@Override
    protected void onNewIntent(Intent intent) {
       homeIntent=intent;
        super.onNewIntent(intent);
    }

 protected void onResume() {
        super.onResume();
        if (homeIntent!=null){
            int id=homeIntent.getIntExtra("id",0);
            if (id==1){
                showFragment(1);//显示指定的fragment
            }
        }
    }



 public void showFragment(int position) {
        hideFragments();
        Fragment fragment = fragments.get(position);
        FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
        ft.show(fragment);
        ft.commit();
    }


 public void hideFragments() {
        FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
        for(Fragment fragment : fragments) {
            if(fragment != null) {
                ft.hide(fragment);
            }
        }
        ft.commit();
    }

经过实践,满足了需求,供大家参考。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值