Android跨Fragment传值点击按钮崩溃问题求助(附代码日志)
问题根源
报错信息明确指向:java.lang.NullPointerException: Attempt to invoke virtual method 'android.text.Editable android.widget.EditText.getText()' on a null object reference,核心原因是你在点击事件里误用了onClick方法参数的view(即被点击的按钮本身)去查找EditText,而非Fragment的根布局view,导致找不到R.id.nmDegrees控件,返回null后调用getText()触发崩溃。
修复步骤
正确获取EditText实例
两种可行方案:- 把EditText初始化提到
onCreateView中,作为Fragment成员变量,避免重复查找 - 在点击事件内使用Fragment的根view(即
onCreateView中inflate出的view对象)查找控件
- 把EditText初始化提到
添加输入校验(推荐)
处理EditText为空、输入非数字的情况,避免后续Integer.parseInt抛出NumberFormatException
修改后代码示例
ThermometerFragment 修复代码
public class ThermometerFragment extends Fragment { private EditText degrees; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_thermometer, container, false); Button enter = view.findViewById(R.id.btTemp); // 在这里用根view初始化EditText degrees = view.findViewById(R.id.nmDegrees); enter.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { String tempInput = degrees.getText().toString().trim(); if (!tempInput.isEmpty()) { try { int tempValue = Integer.parseInt(tempInput); Bundle onOrOff = new Bundle(); onOrOff.putInt("df1", tempValue); getParentFragmentManager().setFragmentResult("dataFromThermometer", onOrOff); degrees.setText(""); } catch (NumberFormatException e) { Toast.makeText(getContext(), "请输入有效数字", Toast.LENGTH_SHORT).show(); } } else { Toast.makeText(getContext(), "温度值不能为空", Toast.LENGTH_SHORT).show(); } } }); return view; } }
HomeFragment 优化代码(补充等于72的场景)
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_home, container, false); getParentFragmentManager().setFragmentResultListener("dataFromThermometer", this, new FragmentResultListener() { @Override public void onFragmentResult(@NonNull String requestKey, @NonNull Bundle onOrOff) { int temP = onOrOff.getInt("df1"); TextView temp = view.findViewById(R.id.tvTemp); if(temP < 72){ temp.setText("Heat On!"); } else if(temP > 72) { temp.setText("Cool Off"); } else { temp.setText("温度适中"); } } }); return view; }
额外注意事项
- 确认
fragment_thermometer.xml中存在id为nmDegrees的EditText,且id拼写完全一致 - 推荐使用View Binding替代
findViewById,从根源避免id匹配错误和空指针问题
内容的提问来源于stack exchange,提问作者Isa
相关产品推荐
相关产品推荐

