You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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()触发崩溃。

修复步骤
  1. 正确获取EditText实例
    两种可行方案:

    • 把EditText初始化提到onCreateView中,作为Fragment成员变量,避免重复查找
    • 在点击事件内使用Fragment的根view(即onCreateView中inflate出的view对象)查找控件
  2. 添加输入校验(推荐)
    处理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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 22:13:10