3

更新)これがガイドのようになりつつある場合は申し訳ありません。これを投稿すべき他のサイトはありますか?

私はyatzyゲームを作成していて、ループの学習に取り組んでいます。私の方法は、この質問の一番上の答えに似ています: forループ内の動的ボタンonclickイベントこれ が私のコードです:(はい、言語を混ぜています、ごめんなさい)

package se.balderskolan.yatzy;

    import java.util.Random;
    import android.os.Bundle;
    import android.app.Activity;
    import android.view.View;
    import android.widget.Button;
    import android.widget.ImageButton;

    public class MainActivity extends Activity {

Button btKasta;
Random r = new Random();
int[] tarningar = new int[5];
int[] bilder = new int [6];
ImageButton [] img= new ImageButton[5];
boolean [] bool = new boolean[5];

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    btKasta = (Button)findViewById(R.id.btKasta);

    bilder [0]=R.drawable.b1; //Pictures of the dices
    bilder [1]=R.drawable.b2;
    bilder [2]=R.drawable.b3;
    bilder [3]=R.drawable.b4;
    bilder [4]=R.drawable.b5;
    bilder [5]=R.drawable.b6;

    img [0] = (ImageButton)findViewById(R.id.imgbt1); //The grafical dices
    img [1] = (ImageButton)findViewById(R.id.imgbt2);
    img [2] = (ImageButton)findViewById(R.id.imgbt3);
    img [3] = (ImageButton)findViewById(R.id.imgbt4);
    img [4] = (ImageButton)findViewById(R.id.imgbt5);


    //The die-buttons (save or not)
    img [0].setOnClickListener(
            new View.OnClickListener() {

                @Override
                public void onClick(View v) {
                    if(bool [0] == false) {
                        bool [0] = true;
                    }

                    else{
                        bool [0] = false;
                    }
                }
            }
            );

    img [1].setOnClickListener(
            new View.OnClickListener() {

                @Override
                public void onClick(View v) {
                    if(bool [1] == false) {
                        bool [1] = true;
                    }

                    else{
                        bool [1] = false;
                    }
                }
            }
            );

    img [2].setOnClickListener(
            new View.OnClickListener() {

                @Override
                public void onClick(View v) {
                    if(bool [2] == false) {
                        bool [2] = true;
                    }

                    else{
                        bool [2] = false;
                    }
                }
            }
            );

    img [3].setOnClickListener(
            new View.OnClickListener() {

                @Override
                public void onClick(View v) {
                    if(bool [3] == false) {
                        bool [3] = true;
                    }

                    else{
                        bool [3] = false;
                    }
                }
            }
            );

    img [4].setOnClickListener(
            new View.OnClickListener() {

                @Override
                public void onClick(View v) {
                    if(bool [4] == false) {
                        bool [4] = true;
                    }

                    else{
                        bool [4] = false;
                    }
                }
            }
            );

    /*I want to replace the code above with something like this below

    for(imgbt=0; imgbt<5; imgbt++){
        img [imgbt].setOnClickListener(
                new View.OnClickListener() {

                    @Override
                    public void onClick(View v) {

                        if(bool [imgbt] == false) {
                            bool [imgbt] = true;
                        }
                        else{
                            bool [imgbt] = false;
                        }

                    }
                }
        );

    }
    */

  //The die-throwing button
    btKasta.setOnClickListener(             
        new View.OnClickListener() {

            @Override
            public void onClick(View v) {

                    for(int i=0; i<5; i++){
                        tarningar [i]=r.nextInt(6);

                        if (bool[i]==false){
                            img [i].setImageResource(bilder [tarningar[i]]);}
                        else{}
                    }                   
                }
            }
    );
}

    }

(forループのないコードを使用して、ボットンにダイスを保存させることに成功したことを付け加えることができます。)

私のコードでいくつかの調査を行った後、私はbutton-for-loopについて次のことを発見しました。

  • 「imgbt」の値は行で5です

    if(bool [imgbt] == false)
    

    これにより、「ArrayIndexOutOfBoundsException」エラーが発生します。

  • すべてのボタンは常にbool[5]のbool値を変更します(これは存在しません。宣言で作成された配列の数を増やすことでこれを見つけました)

私が宣言した場合

    int imgbt = 0

forループの日食の中にはエラーがあります:

    Cannot refer to a non-final variable imgbt inside an inner class defined in a different method

(誰かがこのエラーを説明できますか?)

だから、私の問題の解決策、またはそれを回避する別の方法を知っていますか、お気軽にawnserしてください!

4

3 に答える 3

2

これはAndroidとはあまり関係がなく、基本的なJavaです。要するに:

  • 配列はインデックス0から始まります
  • オブジェクト配列(などBoolean)は、デフォルトでnullsで初期化されます
  • 2つのアレイを同じサイズにする必要があります

それで、

  • ループを0から開始します
  • booolean[]代わりに使用するBoolean[]か、使用前に初期化してBoolean.FALSEください `
  • 両方のアレイのサイズを6にする
于 2012-10-17T08:26:56.120 に答える
1

したがって、実際の問題は、クラスでオーバーライドを定義するときに、可変で非最終的な変数を使用していたことでした。したがって、休眠のように見えるようにコードを変更すると、次のようになります。

for(imgbt=0; imgbt<5; imgbt++){
    public final someInteger = imgbt;
    img [imgbt].setOnClickListener(
           new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if(bool [someInteger] == false) {
                        bool [someInteger] = true;
                    }
                    else{
                        bool [someInteger] = false;
                    }
              }
         }
    );
}

それはうまくいくはずです。

于 2012-10-26T20:32:42.480 に答える
0

次のように、配列をインスタンス化する必要があります。

Boolean bool[] = new Boolean[]{false, false, false, false, false, false, false};
于 2012-10-17T08:25:00.690 に答える