我正在尝试编写一个简单的棒球记分应用程序,主要是作为学习练习。
在这一点上,我有一个功能齐全的应用程序。它有一个活动和一个布局。所有数字(球、罢工、出局、局数)都显示为按钮。我扩展了 android.widget.Button 类,使按钮的文本是一个整数,并在单击按钮时使用 onClick 将值增加 1。该对象还存储一个最大值;当增量达到该值时,计数器重置为 0。例如,“Balls”按钮的最大值为 4,计数为 0、1、2 和 3。当您下次点击它时,它会从 3 翻转回到0。(向那些对棒球一无所知或不关心的人道歉。)
就目前而言,所有这些都可以正常工作(我的扩展按钮类的源代码如下所示)。现在,我正在尝试更改它,以便当一个计数器返回 0 时,其他计数器也会这样做。我不知道如何做到这一点。我的第一直觉是添加到相同的“if”语句中,将值翻转回 0,如下所示:
final ScoreButton strikes = (ScoreButton) findViewById(R.id.strikes);
strikes.zero();
(其中“strikes”是活动中定义的 ScoreButton 对象)。这会返回一个空指针错误。
我的第二个想法是添加一个布尔属性,当增量方法返回 0(“重置”)时可以设置该属性。但我不明白在哪里阅读这个属性。我可以在 onResume 方法中检查一次,但尝试执行类似“while”循环的操作来重复读取变量只是锁定了应用程序,甚至没有显示主布局。
试图研究一种更好的方法来做到这一点让我阅读了关于 AsyncTask 的文章,这似乎有点矫枉过正,而且我不确定它是否会工作,因为任务(即检查特定按钮是否已被重置)没有结尾。
在这一点上,这似乎是一件如此简单的事情,以至于我一定错过了一些明显的事情。我很感激你有任何建议。
我的自定义按钮类的代码:
import android.widget.Button;
import android.content.Context;
import android.view.View;
import android.util.AttributeSet;
public class ScoreButton extends Button {
protected int flipCount;
protected int currCount;
protected boolean reset;
public ScoreButton(Context context) {
super(context);
}
public ScoreButton(Context context, AttributeSet attr) {
super(context, attr);
setOnClickListener(incr);
setOnLongClickListener(dec);
}
public void init(int start, int max ) {
flipCount = max; /** number at which the counter goes back to 0 **/
currCount = start; /** number to start at **/
reset = false;
setText(Integer.toString(currCount));
}
/** reset the button value to 0 **/
public void zero() {
currCount = 0;
setText(Integer.toString(currCount));
}
private OnClickListener incr = new OnClickListener() {
public void onClick(View v) {
currCount++; /** increment number on button **/
if (currCount == flipCount) { /** if at the maximum value, go back to 0 **/
currCount = 0;
reset = true;
final ScoreButton strikes = (ScoreButton) findViewById(R.id.strikes);
strikes.zero();
}
setText(Integer.toString(currCount)); /** display the new button text **/
}
} ;
/** this method decreases the value by 1 on a long click **/
private OnLongClickListener dec = new OnLongClickListener() {
public boolean onLongClick(View v) {
currCount--;
if (currCount == -1) {
currCount=0;
}
setText(Integer.toString(currCount));
return true;
}
} ;
}