关闭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读取参数,正确流程是:
- 关闭当前待关闭的Activity前,通过Activity的结果回传机制(
setResult、全局共享的ViewModel、事件总线等)把要传递的值回传给要返回的目标Activity - 目标Activity拿到回传的值后,从自身的FragmentManager中查找已经存在的目标Fragment实例,调用Fragment对外暴露的公开方法传值:
// 目标Activity中接收回传值后的逻辑 FragmentA targetFragment = (FragmentA) getSupportFragmentManager().findFragmentById(R.id.idViewPager); if (targetFragment != null) { // 调用Fragment的公开方法传递数据 targetFragment.receiveValueFromClosedPage(value); } - 在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
相关产品推荐
相关产品推荐

