主に学習演習として、単純な野球のスコア管理アプリを作成しようとしています。
この時点で、完全に機能するアプリができました。単一のアクティビティと単一のレイアウトがあります。すべての数字 (ボール、ストライク、アウト、イニング) がボタンとして表示されます。ボタンのテキストが整数になるように android.widget.Button クラスを拡張し、ボタンがクリックされたときに onClick を使用して値を 1 増やしました。オブジェクトには最大値も格納されます。増分がその値に達すると、カウンターは 0 にリセットされます。たとえば、「ボール」ボタンの最大値は 4 で、0、1、2、3 をカウントします。次に押すと、3 から反転します。 back to 0. (野球について何も知らない、または気にしない人には申し訳ありません。)
これはすべて問題なく動作します (以下に示す拡張ボタン クラスのソース コード)。現在、1 つのカウンターが 0 に戻ると、他のカウンターも 0 に戻るように変更しようとしています。私はこれを行う方法について途方に暮れています。私の最初の本能は、次のように値を 0 に戻す同じ「if」ステートメントに追加することでした。
final ScoreButton strikes = (ScoreButton) findViewById(R.id.strikes);
strikes.zero();
(「strikes」は、アクティビティで定義された ScoreButton オブジェクトです)。これにより、Null Pointer エラーが返されます。
次に考えたのは、increment メソッドが 0 (「リセット」) に戻ったときに設定できるブール属性を追加することでした。しかし、この属性の読み方がわかりません。onResume メソッドで 1 回確認できますが、「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;
}
} ;
}