android - 计时器问题
问题描述
我做的计时器有问题。每次我打开应用程序时,我的应用程序都会停止。有人能帮我吗?
我做了两个按钮:开始/暂停按钮
<Chronometer
android:id="@+id/chronometer"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:fontFamily="@font/baloo"
android:textColor="@color/white"
android:textSize="28sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@+id/aantal_km"
app:layout_constraintTop_toTopOf="@+id/aantal_km" />
重置按钮:
<ImageButton
android:id="@+id/button_reset"
android:layout_width="60dp"
android:layout_height="50dp"
android:layout_marginTop="40dp"
android:layout_marginEnd="90dp"
android:background="@drawable/button_background"
android:src="@drawable/ic_baseline_replay_24"
app:layout_constraintEnd_toEndOf="@+id/detectorList"
app:layout_constraintStart_toEndOf="@+id/button_start"
app:layout_constraintTop_toBottomOf="@+id/text_stappen" />
在一个新类中,我创建了一些新变量:
public class NewCounterFragment extends Fragment {
private Chronometer chronometer;
private long PausOffset = 0;
private boolean isPlaying = false;
private ToggleButton button_start;
private Button button_reset;
}
然后我做了我的计时器:
chronometer = view.findViewById(R.id.chronometer);
button_start = view.findViewById(R.id.button_start);
button_reset = view.findViewById(R.id.button_reset);
button_start.setText(null);
button_start.setTextOn(null);
button_start.setTextOff(null);
button_start.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
if (b){
chronometer.setBase(SystemClock.elapsedRealtime() - PausOffset);
chronometer.start();
isPlaying = true;
}
else{
chronometer.stop();
PausOffset = SystemClock.elapsedRealtime() - chronometer.getBase();
isPlaying = false;
}
}
});
button_reset.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (isPlaying){
chronometer.setBase(SystemClock.elapsedRealtime());
PausOffset = 0;
chronometer.start();
isPlaying=true;
}
}
});
这些是运行应用程序后 logcat 中的错误:
2020-11-25 15:26:53.662 4404-4404/be.ugent.elis.csl.stappenteller E/AndroidRuntime: FATAL EXCEPTION: main
Process: be.ugent.elis.csl.stappenteller, PID: 4404
java.lang.RuntimeException: Unable to start activity ComponentInfo{be.ugent.elis.csl.stappenteller/be.ugent.elis.csl.stappenteller.MainActivity}: java.lang.ClassCastException: android.support.v7.widget.AppCompatButton cannot be cast to android.widget.ToggleButton
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2646)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707)
at android.app.ActivityThread.-wrap12(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6077)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756)
Caused by: java.lang.ClassCastException: android.support.v7.widget.AppCompatButton cannot be cast to android.widget.ToggleButton
at be.ugent.elis.csl.stappenteller.NewCounterFragment.onCreateView(NewCounterFragment.java:118)
at android.app.Fragment.performCreateView(Fragment.java:2353)
at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:995)
at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1171)
at android.app.BackStackRecord.run(BackStackRecord.java:815)
at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1578)
at android.app.FragmentController.execPendingActions(FragmentController.java:371)
at android.app.Activity.performStart(Activity.java:6678)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2609)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707)
at android.app.ActivityThread.-wrap12(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6077)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756)
我不明白我做错了什么。有人能帮我吗?
解决方案
您需要声明button_reset
为:
private ImageButton button_reset;
该错误是因为您试图将其转换为Button
.
此外,请确保在您的 XMLbutton_start
中将其声明为 a ToggleButton
,因为从错误来看,您似乎已将其声明为 a Button
。
<ToggleButton
android:id="@+id/button_start"
...
推荐阅读
- sql - 查询所有孩子都具有一定价值的父母
- oracle - 此查询中的无效关系运算符
- c# - 应用程序在本地工作,但不能在 IIS 托管服务器 Framework 4.5 上工作
- java - 每个区域的单例实例
- sass - 有没有办法设置 node-sass 配置文件?
- php - 如何在 foreach 之外获取所有 xml 数据或如何在 xml 中声明此 foreach
- git - Git - 在特定提交之前压缩历史中的所有提交
- amazon-web-services - 无法启动 Redis In-Memory Data Store。Ubuntu 18.04
- php - 在 Laravel&Angular 项目中分离 AngularJS 控制器文件
- mysql - 数据库设计 SQL 和转换表