Android:基于一个对象的onClick操作多个(按钮)对象

Android:基于一个对象的onClick操作多个(按钮)对象,android,object,button,Android,Object,Button,我正在尝试编写一个简单的棒球记分应用程序,主要是作为一个学习练习 在这一点上,我有一个功能齐全的应用程序。它只有一个活动和一个布局。所有的球数、击数、出局数、局数都显示为按钮。我扩展了android.widget.Button类,使按钮的文本为整数,并在单击按钮时使用onClick将值增加1。对象还存储最大值;当增量达到该值时,计数器重置为0。例如,Balls按钮的最大值为4,计数为0、1、2和3。当你下次击中它时,它会从3翻转回0。向那些对棒球一无所知的人道歉 所有这些工作都很好,因为我的扩展

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

在这一点上,我有一个功能齐全的应用程序。它只有一个活动和一个布局。所有的球数、击数、出局数、局数都显示为按钮。我扩展了android.widget.Button类,使按钮的文本为整数,并在单击按钮时使用onClick将值增加1。对象还存储最大值;当增量达到该值时,计数器重置为0。例如,Balls按钮的最大值为4,计数为0、1、2和3。当你下次击中它时,它会从3翻转回0。向那些对棒球一无所知的人道歉

所有这些工作都很好,因为我的扩展按钮类的源代码如下所示。现在,我试图改变它,这样当一个计数器返回到0时,其他计数器也返回到0。我不知道该怎么做。我的第一反应是添加相同的“if”语句,将值翻转回0,如下所示:

final ScoreButton strikes = (ScoreButton) findViewById(R.id.strikes);
strikes.zero();
其中,Strokes是活动中定义的ScoreButton对象。这将返回一个空指针错误

我的第二个想法是添加一个布尔属性,当increment方法返回到0 reset时可以设置该属性。但我不明白在哪里读这个属性。我可以在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;
}
} ;
}

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

以下是我的建议: 您可以为所有ScoreButton提供一个更复杂的onClickListener,您可以从活动的范围(而不是ScoreButton类的范围)在活动中定义它。这将是一个监听器,其中包含所有按钮作为成员变量的信息。您只需要创建它的一个实例,但将其传递给所有ScoreButton[或通过setOnClickListener传递给按钮。当需要包装其中一个分数时,您只需将侦听器中的所有其他计数器设置为0。[注:在这种方法中,您甚至不需要对Button进行子类化,但如果您愿意,可以这样做]


但是,既然您说您正在学习,您甚至可以尝试创建一个ScoreButtonGroupView,您可以将其放在视图层次结构中。这将是一个很好的自包含解决方案,它具有适当设置按钮值的内部逻辑,正如我认为您试图通过子类化按钮来实现的那样。

谢谢,我没有想到这一点我可以为所有按钮定义一个通用的onClick处理程序。我会这么做的。组视图是一个很有吸引力的想法,但我想我会把它留给未来的版本。