1

主に学習演習として、単純な野球のスコア管理アプリを作成しようとしています。

この時点で、完全に機能するアプリができました。単一のアクティビティと単一のレイアウトがあります。すべての数字 (ボール、ストライク、アウト、イニング) がボタンとして表示されます。ボタンのテキストが整数になるように 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;
}
} ;
}
4

1 に答える 1

0

AsynkTaskあなたが説明した方法を試みないのは正しいです。それは正しくありません。

これが私の提案です:すべてのScoreButtonsa を、アクティビティで定義するより複雑にすることができます (クラスのonClickListenerスコープではなく、アクティビティのスコープから)。これは、メンバー変数としてScoreButtonすべての に関する情報を含む 1 つのリスナーになります。Buttonそのインスタンスを 1 つだけ作成し、それをすべてのScoreButtons [ またはButtons throughに渡しますsetOnClickListener()。スコアの 1 つをラップする必要がある場合は、リスナーの他のすべてのカウンターを 0 に設定するだけButtonです。

ScoreButtonGroupViewただし、学習していると言ったので、ビュー階層に配置できる を作成してみてください。これは、ボタンの値を適切に設定するための内部ロジックを持つ優れた自己完結型のソリューションです (サブクラス化によって実行しようとしていたと思いますButton)。

于 2012-04-16T02:04:22.670 に答える