首页 > 解决方案 > 计时器问题

问题描述

我做的计时器有问题。每次我打开应用程序时,我的应用程序都会停止。有人能帮我吗?

我做了两个按钮:开始/暂停按钮

<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) 

我不明白我做错了什么。有人能帮我吗?

标签: androidandroid-studio

解决方案


您需要声明button_reset为:

private ImageButton button_reset;

该错误是因为您试图将其转换为Button.

此外,请确保在您的 XMLbutton_start中将其声明为 a ToggleButton,因为从错误来看,您似乎已将其声明为 a Button

<ToggleButton
     android:id="@+id/button_start"
     ...

推荐阅读