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; } } }; }
关键修改点
- 变量作用域调整:将
value1、value2、value3提升为Activity的成员变量,这样变量的生命周期与Activity一致,每次点击时会基于之前的数值进行累加/递减,不会被重置。 - 初始化TextView文本:在
onCreate中把三个时间TextView的初始文本设置为"0",替换默认的"TIME",既符合功能逻辑,也避免后续如果从TextView读取数值时出现转换异常。 - 添加负数防护(可选):在递减操作前增加判断,防止学习时长变为负数,符合实际使用场景。
内容的提问来源于stack exchange,提问作者Andrew
相关产品推荐
相关产品推荐

