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

Android科目计时应用按钮点击计数无法累加问题咨询

问题描述

开发一款统计各科目学习时长的Android应用,点击对应科目的+1/-1按钮时,需同步更新TextView中显示的时长数值。目前使用switch语句处理按钮点击事件,但点击按钮时数值无法正确累加或递减。

XML布局代码

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/btn11"
        android:layout_width="79dp"
        android:layout_height="44dp"
        android:layout_marginEnd="12dp"
        android:layout_marginBottom="180dp"
        android:text="+1"
        app:layout_constraintBottom_toTopOf="@+id/btn21"
        app:layout_constraintEnd_toStartOf="@+id/btn12"
        app:layout_constraintHorizontal_bias="0.448"
        app:layout_constraintStart_toEndOf="@+id/txtTime1" />

    <Button
        android:id="@+id/btn21"
        android:layout_width="79dp"
        android:layout_height="44dp"
        android:layout_marginEnd="28dp"
        android:layout_marginBottom="212dp"
        android:text="+1"
        app:layout_constraintBottom_toTopOf="@+id/btn31"
        app:layout_constraintEnd_toStartOf="@+id/btn22" />

    <Button
        android:id="@+id/btn31"
        android:layout_width="79dp"
        android:layout_height="44dp"
        android:layout_marginEnd="16dp"
        android:layout_marginBottom="60dp"
        android:text="+1"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toStartOf="@+id/btn32" />

    <Button
        android:id="@+id/btn12"
        android:layout_width="79dp"
        android:layout_height="44dp"
        android:layout_marginEnd="16dp"
        android:layout_marginBottom="180dp"
        android:text="-1"
        app:layout_constraintBottom_toTopOf="@+id/btn22"
        app:layout_constraintEnd_toEndOf="parent" />

    <Button
        android:id="@+id/btn22"
        android:layout_width="79dp"
        android:layout_height="44dp"
        android:layout_marginEnd="12dp"
        android:layout_marginBottom="212dp"
        android:text="-1"
        app:layout_constraintBottom_toTopOf="@+id/btn32"
        app:layout_constraintEnd_toEndOf="parent" />

    <Button
        android:id="@+id/btn32"
        android:layout_width="79dp"
        android:layout_height="44dp"
        android:layout_marginEnd="16dp"
        android:layout_marginBottom="60dp"
        android:text="-1"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent" />

    <TextView
        android:id="@+id/txtJava"
        android:layout_width="188dp"
        android:layout_height="62dp"
        android:text="JAVA"
        android:textAlignment="center"
        android:textSize="40sp"
        app:layout_constraintBottom_toTopOf="@+id/txtTime1"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.053"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.32" />

    <TextView
        android:id="@+id/txtEng"
        android:layout_width="188dp"
        android:layout_height="62dp"
        android:layout_marginBottom="24dp"
        android:text="ENGLISH"
        android:textAlignment="center"
        android:textSize="40sp"
        app:layout_constraintBottom_toTopOf="@+id/txtTime2"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.062"
        app:layout_constraintStart_toStartOf="parent" />

    <TextView
        android:id="@+id/txtMath"
        android:layout_width="188dp"
        android:layout_height="62dp"
        android:layout_marginBottom="24dp"
        android:text="MATH"
        android:textAlignment="center"
        android:textSize="40sp"
        app:layout_constraintBottom_toTopOf="@+id/txtTime3"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.053"
        app:layout_constraintStart_toStartOf="parent" />

    <TextView
        android:id="@+id/txtTime1"
        android:layout_width="188dp"
        android:layout_height="62dp"
        android:layout_marginStart="12dp"
        android:layout_marginBottom="80dp"
        android:text="TIME"
        android:textAlignment="center"
        android:textSize="40sp"
        app:layout_constraintBottom_toTopOf="@+id/txtEng"
        app:layout_constraintStart_toStartOf="parent" />

    <TextView
        android:id="@+id/txtTime2"
        android:layout_width="188dp"
        android:layout_height="62dp"
        android:layout_marginStart="12dp"
        android:layout_marginBottom="104dp"
        android:text="TIME"
        android:textAlignment="center"
        android:textSize="40sp"
        app:layout_constraintBottom_toTopOf="@+id/txtMath"
        app:layout_constraintStart_toStartOf="parent" />

    <TextView
        android:id="@+id/txtTime3"
        android:layout_width="188dp"
        android:layout_height="62dp"
        android:layout_marginStart="12dp"
        android:layout_marginBottom="52dp"
        android:text="TIME"
        android:textAlignment="center"
        android:textSize="40sp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toStartOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

原始Java代码

package com.example.times;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    private TextView txtJava;
    private TextView txtTime1;

    private TextView txtEng;
    private TextView txtTime2;

    private TextView txtMath;
    private TextView txtTime3;

    private Button btn11;
    private Button btn12;
    private Button btn21;
    private Button btn22;
    private Button btn31;
    private Button btn32;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        txtJava = findViewById(R.id.txtJava);
        txtTime1 = findViewById(R.id.txtTime1);
        txtEng = findViewById(R.id.txtEng);
        txtTime2 = findViewById(R.id.txtTime2);
        txtMath = findViewById(R.id.txtMath);
        txtTime3 = findViewById(R.id.txtTime3);
        btn11 = findViewById(R.id.btn11);
        btn12 = findViewById(R.id.btn12);
        btn21 = findViewById(R.id.btn21);
        btn22 = findViewById(R.id.btn22);
        btn31 = findViewById(R.id.btn31);
        btn32 = findViewById(R.id.btn32);

        btn11.setOnClickListener(listener);
        btn12.setOnClickListener(listener);
        btn21.setOnClickListener(listener);
        btn22.setOnClickListener(listener);
        btn31.setOnClickListener(listener);
        btn32.setOnClickListener(listener);
    }

    private View.OnClickListener listener = new View.OnClickListener() {

        @Override
        public void onClick(View view) {
            int value1 = 0;
            int value2 = 0;
            int value3 = 0;
            switch (view.getId()) {
                case R.id.btn11:
                    value1+=1;
                    String s11 = String.valueOf(value1);
                    txtTime1.setText(s11);
                    break;
                case R.id.btn12:
                    value1-=1;
                    String s12 = String.valueOf(value1);
                    txtTime1.setText(s12);
                    break;
                case R.id.btn21:
                    value2+=1;
                    String s21 = String.valueOf(value2);
                    txtTime2.setText(s21);
                    break;
                case R.id.btn22:
                    value2-=1;
                    String s22 = String.valueOf(value2);
                    txtTime2.setText(s22);
                    break;
                case R.id.btn31:
                    value3+=1;
                    String s31 = String.valueOf(value3);
                    txtTime3.setText(s31);
                    break;
                case R.id.btn32:
                    value3-=1;
                    String s32 = String.valueOf(value3);
                    txtTime3.setText(s32);
                    break;
            }

        }
    };
}
问题原因

核心问题是value1、value2、value3被定义在onClick方法内部,每次按钮点击时,这三个变量都会被重新初始化为0。所以每次点击的累加/递减操作只在当前点击周期内有效,下次点击时变量又回到0,无法保留之前的计数状态。另外,初始时TextView显示的是"TIME",如果后续从TextView读取数值计算,会抛出字符串转整数的异常。

修复后的Java代码
package com.example.times;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    private TextView txtJava;
    private TextView txtTime1;

    private TextView txtEng;
    private TextView txtTime2;

    private TextView txtMath;
    private TextView txtTime3;

    private Button btn11;
    private Button btn12;
    private Button btn21;
    private Button btn22;
    private Button btn31;
    private Button btn32;

    // 将计数变量改为Activity成员变量,保留状态
    private int value1 = 0;
    private int value2 = 0;
    private int value3 = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        txtJava = findViewById(R.id.txtJava);
        txtTime1 = findViewById(R.id.txtTime1);
        txtEng = findViewById(R.id.txtEng);
        txtTime2 = findViewById(R.id.txtTime2);
        txtMath = findViewById(R.id.txtMath);
        txtTime3 = findViewById(R.id.txtTime3);
        btn11 = findViewById(R.id.btn11);
        btn12 = findViewById(R.id.btn12);
        btn21 = findViewById(R.id.btn21);
        btn22 = findViewById(R.id.btn22);
        btn31 = findViewById(R.id.btn31);
        btn32 = findViewById(R.id.btn32);

        // 初始化TextView显示为0,避免后续异常
        txtTime1.setText(String.valueOf(value1));
        txtTime2.setText(String.valueOf(value2));
        txtTime3.setText(String.valueOf(value3));

        btn11.setOnClickListener(listener);
        btn12.setOnClickListener(listener);
        btn21.setOnClickListener(listener);
        btn22.setOnClickListener(listener);
        btn31.setOnClickListener(listener);
        btn32.setOnClickListener(listener);
    }

    private View.OnClickListener listener = new View.OnClickListener() {

        @Override
        public void onClick(View view) {
            switch (view.getId()) {
                case R.id.btn11:
                    value1 += 1;
                    txtTime1.setText(String.valueOf(value1));
                    break;
                case R.id.btn12:
                    // 可选:防止计数变为负数
                    if (value1 > 0) {
                        value1 -= 1;
                    }
                    txtTime1.setText(String.valueOf(value1));
                    break;
                case R.id.btn21:
                    value2 += 1;
                    txtTime2.setText(String.valueOf(value2));
                    break;
                case R.id.btn22:
                    if (value2 > 0) {
                        value2 -= 1;
                    }
                    txtTime2.setText(String.valueOf(value2));
                    break;
                case R.id.btn31:
                    value3 += 1;
                    txtTime3.setText(String.valueOf(value3));
                    break;
                case R.id.btn32:
                    if (value3 > 0) {
                        value3 -= 1;
                    }
                    txtTime3.setText(String.valueOf(value3));
                    break;
            }
        }
    };
}
关键修改点
  1. 变量作用域调整:将value1、value2、value3提升为Activity的成员变量,这样变量的生命周期与Activity一致,每次点击时会基于之前的数值进行累加/递减,不会被重置。
  2. 初始化TextView文本:在onCreate中把三个时间TextView的初始文本设置为"0",替换默认的"TIME",既符合功能逻辑,也避免后续如果从TextView读取数值时出现转换异常。
  3. 添加负数防护(可选):在递减操作前增加判断,防止学习时长变为负数,符合实际使用场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 06:38:13