开发秒表/随机数生成器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
相关产品推荐
相关产品推荐

