1

我正在尝试编写一个简单的棒球记分应用程序,主要是作为学习练习。

在这一点上,我有一个功能齐全的应用程序。它有一个活动和一个布局。所有数字(球、罢工、出局、局数)都显示为按钮。我扩展了 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;
}
} ;
}
4

1 回答 1

0

您不尝试AsynkTask您描述的方法是正确的。这是不正确的。

这是我的建议:您可以将您在 Activity 中定义的所有ScoreButtonsa 都赋予更复杂onClickListener的内容(从您的 Activity 范围,而不是ScoreButton类的范围)。这将是一个侦听器,其中包含有关所有Buttons 作为成员变量的信息。您只会创建它的一个实例,但会将其传递给您的所有ScoreButtons [或Buttons through setOnClickListener()。当需要包装其中一个分数时,您只需将侦听器中的所有其他计数器设置为 0。[注意:在这种方法中,您甚至不需要子类化,Button尽管您可以根据需要进行子类化]。

然而,既然你说你正在学习,你甚至可以尝试创建一个ScoreButtonGroupView你可以放置在你的视图层次结构中的东西。这将是一个很好的独立解决方案,它具有适当设置按钮值的内部逻辑(正如我认为你试图通过子类化来做的那样Button)。

于 2012-04-16T02:04:22.670 回答