You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关闭Activity时如何向另一Activity内的Fragment传值及No view found报错解决

问题根因与落地解决方案

崩溃触发的直接原因

你遇到的java.lang.IllegalArgumentException: No view found for id 0x7f080163,本质是执行Fragment事务时,传入的容器id对应的控件在当前Activity的视图层级中完全不存在,常见触发场景包括:

  • 执行commit()时,Activity尚未完成setContentView()初始化,整体视图树还未构建完成,自然无法匹配到目标id对应的控件
  • 操作的Fragment容器归属错误:你代码里传入的R.id.idViewPager属于返回页的布局,却在当前待关闭的Activity中查找,当前Activity的视图树里根本没有这个id的控件,直接触发崩溃
  • 容器嵌套层级错配:如果目标ViewPager是嵌套在某个子Fragment内部的,却用Activity级别的getSupportFragmentManager()执行事务,也会出现找不到对应视图的问题

需求实现的正确逻辑

你的核心需求是关闭当前Activity时,把值传递给另一个已存在的Activity内部的Fragment,你现在写的「新建Fragment时setArguments传参」的逻辑本身只适用于“创建新Fragment实例时初始化传参”的场景,和你的实际需求不匹配,可根据实际业务场景选择对应实现方案:

场景1:目标Fragment是接收值的Activity中已经存在的实例

这种情况下不能依靠setArguments传值——已经添加完成的Fragment不会重新执行onCreate读取参数,正确流程是:

  1. 关闭当前待关闭的Activity前,通过Activity的结果回传机制(setResult、全局共享的ViewModel、事件总线等)把要传递的值回传给要返回的目标Activity
  2. 目标Activity拿到回传的值后,从自身的FragmentManager中查找已经存在的目标Fragment实例,调用Fragment对外暴露的公开方法传值:
    // 目标Activity中接收回传值后的逻辑
    FragmentA targetFragment = (FragmentA) getSupportFragmentManager().findFragmentById(R.id.idViewPager);
    if (targetFragment != null) {
        // 调用Fragment的公开方法传递数据
        targetFragment.receiveValueFromClosedPage(value);
    }
    
  3. 在Fragment A中实现对应的公开接收方法,在方法内处理数据、刷新UI,不要依赖onCreate里读Arguments:
    // Fragment A 内的方法
    public void receiveValueFromClosedPage(boolean value) {
        // 处理接收到的数值逻辑
    }
    

场景2:目标Fragment是目标Activity收到回传值后才需要新建的实例

这种场景下你原本写的setArguments逻辑是适用的,只需要修正崩溃问题:

  • 必须保证Activity完成setContentView()、视图树加载完成后,再执行Fragment事务的replace、commit操作,禁止在视图初始化前调用事务
  • 校验传入的容器id确实存在于当前Activity绑定的布局文件中,id值和布局定义完全一致
  • 如果目标容器嵌套在其他Fragment内部,必须使用对应父Fragment的childFragmentManager执行事务,不能直接用Activity级别的FragmentManager

内容的提问来源于stack exchange,提问作者MitchSaver

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.26 15:06:04