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

开发秒表/随机数生成器App时点击功能按钮崩溃求助

Android Fragment按钮点击崩溃问题修复

秒表Fragment崩溃原因与修复

崩溃原因:chronometer对象未初始化,直接调用其方法导致NullPointerException。

修复代码:

public class frStopwatch extends Fragment {

    View view;
    EditText etTime;
    Button btnStartStop;
    Button btnReset;

    Chronometer chronometer;
    private boolean running;
    private long pauseOffset;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        view = inflater.inflate(R.layout.fragment_fr_stopwatch, container, false);

        // 初始化Chronometer控件
        chronometer = view.findViewById(R.id.chronometer);
        btnStartStop = view.findViewById(R.id.btnStartStop);
        btnReset = view.findViewById(R.id.btnReset);

        btnStartStop.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (!running) {
                    chronometer.setBase(SystemClock.elapsedRealtime() - pauseOffset);
                    chronometer.start();
                    running = true;
                    btnStartStop.setText("停止");
                } else {
                    chronometer.stop();
                    pauseOffset = SystemClock.elapsedRealtime() - chronometer.getBase();
                    running = false;
                    btnStartStop.setText("开始");
                }
            }
        });

        btnReset.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                chronometer.setBase(SystemClock.elapsedRealtime());
                pauseOffset = 0;
                running = false;
                btnStartStop.setText("开始");
            }
        });
        return view;
    }

    // 保留Fragment实例,切换时不销毁,保证秒表持续运行
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setRetainInstance(true);
    }
}

说明:

  • 新增chronometer的初始化代码,通过view.findViewById绑定布局中的控件
  • 完善启停按钮逻辑,支持切换开始/停止状态
  • 重写onCreate方法调用setRetainInstance(true),确保Fragment切换时不被销毁,秒表持续计时

随机数生成器Fragment崩溃原因与修复

崩溃原因:etShowNum.setText(r.nextInt(9))传入int值时,系统会将其视为字符串资源ID查找,导致ResourceNotFoundException(找不到对应ID的资源)。

修复代码:

public class frRandomizer extends Fragment {

    View view;
    Button btnRandom;
    EditText etShowNum;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        view = inflater.inflate(R.layout.fragment_fr_randomizer, container, false);

        btnRandom = view.findViewById(R.id.btnRandom);
        etShowNum = view.findViewById(R.id.etShowNum);
        
        btnRandom.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Random r = new Random();
                // 将int转为String后设置到EditText
                etShowNum.setText(String.valueOf(r.nextInt(9)));
                // 或者用 etShowNum.setText(r.nextInt(9) + "");
            }
        });
        return view;
    }
}

说明:将随机生成的int值通过String.valueOf()转为字符串,再传递给setText()方法,避免资源查找错误。

内容的提问来源于stack exchange,提问作者Bartul

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 21:45:35