Android Activity向Fragment传递ArrayList返回null致应用崩溃问题
崩溃原因
你遇到的空指针崩溃本质是Fragment初始化时机和传参时机不匹配:
- 你在
activity_main.xml里用<fragment>标签静态声明了TickerListFragment,系统会在Activity调用setContentView()解析布局时,自动创建这个Fragment的实例,立刻执行它的onCreateView生命周期。 - 你给Fragment设置参数的逻辑写在
setContentView()之后,这时候静态声明的Fragment已经初始化完成,且创建时没有携带任何Bundle参数,调用getArguments()自然返回null,触发空指针。 - 你后续写的
fragmentTransaction.replace()逻辑,要等布局解析完(此时崩溃已经发生)才会执行,根本赶不上Fragment第一次初始化的节点。
修复步骤
1. 替换布局中的静态Fragment标签
不要在XML里直接写死Fragment类名,换成通用的Fragment容器,避免系统提前自动创建无参Fragment实例。修改后的activity_main.xml代码如下:
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <FrameLayout android:id="@+id/list_fragment" android:layout_width="wrap_content" android:layout_height="match_parent" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> </androidx.constraintlayout.widget.ConstraintLayout>
2. 给Fragment参数读取加空安全
不要直接链式调用getArguments()的方法,增加非空判断,极端场景下避免崩溃。修改TickerListFragment的onCreateView代码:
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle state) { View view = inflater.inflate(R.layout.fragment_tickerlist, container, false); Bundle args = getArguments(); if (args != null) { def_tickers = args.getStringArrayList("def"); } // 兜底初始化,避免后续操作列表时空指针 if (def_tickers == null) { def_tickers = new ArrayList<>(); } return view; }
注意事项
- 你原来写的Fragment创建、传参、事务提交逻辑本身没有问题,只是静态Fragment标签的用法和动态传参逻辑冲突。
- XML静态声明Fragment的写法只适合不需要动态传参的固定Fragment场景,只要需要给Fragment传动态参数,优先用容器+动态提交事务的写法。
- 不要给Fragment写带参数的构造函数,系统在页面重建时会反射调用Fragment的无参构造,传参一律用
setArguments()的方式,避免重建时参数丢失。
内容的提问来源于stack exchange,提问作者git-carlos
相关产品推荐
相关产品推荐

