Android Fragment中RadioButton点击跳转Activity闪退如何解决
问题根因
- 核心潜在原因1:
Specialist.class/Doctor.class未在项目AndroidManifest.xml中注册,安卓要求所有Activity必须在清单文件声明才能跳转,未声明会直接触发崩溃。 - 核心潜在原因2:Intent初始化时机不合理。你当前在
onCreateView生命周期中直接调用getActivity()创建Intent,若此时Fragment还未完成和宿主Activity的绑定,getActivity()会返回null,触发空指针异常导致闪退。 - 可选优化点:给单选组的每个RadioButton单独设点击事件不符合RadioGroup的使用规范,推荐统一监听选中状态变化,代码更易维护。
修复后的实现代码
首先需要在AndroidManifest.xml中注册两个目标Activity,代码如下:
<!-- 加到AndroidManifest.xml的<application>标签内部 --> <activity android:name=".Specialist"/> <activity android:name=".Doctor"/>
修改后的Fragment2.java代码:
package com.example.tabbedapp; import android.content.Intent; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.RadioGroup; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.fragment.app.Fragment; public class Fragment2 extends Fragment { public Fragment2(){ } @Nullable @Override public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.fragment2_layout, container, false); // 获取单选组实例 RadioGroup radioGroup = rootView.findViewById(R.id.G1); // 统一监听选中状态变化 radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() { @Override public void onCheckedChanged(RadioGroup group, int checkedId) { // 点击时再获取context创建Intent,避免空指针 if (getActivity() == null) return; Intent intent = null; if (checkedId == R.id.R1) { intent = new Intent(getActivity(), Specialist.class); } else if (checkedId == R.id.R2) { intent = new Intent(getActivity(), Doctor.class); } if (intent != null) { startActivity(intent); } } }); return rootView; } }
额外说明
- 如果修复后仍闪退,可以通过Logcat筛选
AndroidRuntime标签查看具体崩溃堆栈,定位其他潜在问题。 - 若跳转时需要传递参数,可在Intent创建后调用
putExtra()方法传入对应数据。
内容的提问来源于stack exchange,提问作者Suji
相关产品推荐
相关产品推荐

