Android Fragment间Bundle传RecyclerView点击位置报空指针
问题核心原因
你在RecyclerView条目点击回调中,仅创建了GalleryFragment实例并为其设置了Bundle参数,但没有执行Fragment事务提交逻辑,将这个绑定了参数的实例真正添加/替换到界面上显示。当前界面实际加载的GalleryFragment是无参数的其他实例,因此调用getArguments()会返回null,触发空指针异常。
另外你之前尝试把传参逻辑放到第一个Fragment的onCreate方法中无效,是因为onCreate执行时机远早于用户点击RecyclerView的时机,此时点击回调还没触发,position还未被赋值,根本拿不到正确的传值。
适配器部分的点击回调传position逻辑没有问题,本次异常和适配器代码无关。
修复方案
- 补全Fragment跳转提交逻辑,确保绑定了参数的
GalleryFragment实例被实际加载显示
在第一个Fragment的onclic回调中,setArguments()完成后立刻执行Fragment提交操作,参考代码如下:
如果你项目使用Navigation组件导航,不要手动new Fragment,直接调用navigate方法时传入Bundle参数即可。@Override public void onclic(int position) { System.out.println(position); Toast.makeText(getActivity(), "aight", Toast.LENGTH_SHORT).show(); thepostion = position; GalleryFragment fragment = new GalleryFragment(); Bundle bundle = new Bundle(); bundle.putInt("themed", thepostion); fragment.setArguments(bundle); // 以下是你之前遗漏的Fragment提交逻辑,替换为你项目实际使用的导航方式即可 requireActivity().getSupportFragmentManager() .beginTransaction() .replace(R.id.你的Fragment容器布局ID, fragment) .addToBackStack(null) // 需要支持返回上一个Fragment时保留,不需要可删除 .commit(); } - 给目标Fragment的参数读取增加空安全判断,避免极端场景崩溃
在GalleryFragment读取参数时增加非空判断,参考代码:@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Bundle bundle = getArguments(); if (bundle != null) { // 第二个参数是key不存在时的默认值,避免返回默认0导致业务逻辑异常 int x = bundle.getInt("themed", -1); System.out.println("gallery" + x); } else { // 无参数时的兜底逻辑,比如弹出提示、返回上一页 } }
注意事项
setArguments()方法必须在Fragment被提交到FragmentManager之前调用,你之前的写法是设置完参数后没有提交对应实例,相当于创建了一个带参数的Fragment对象但从未使用,参数自然无法被目标页面拿到。
内容的提问来源于stack exchange,提问作者Aliy
相关产品推荐
相关产品推荐

