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{}
                    }                   
                }
            }
    );
}

    }

(我可以补充一点,我已经成功地让 bottons 使用没有 for 循环的代码保存了骰子。)

在对我的代码进行一些研究后,我发现了以下有关按钮循环的信息:

  • “imgbt”的值为 5 在行

    if(bool [imgbt] == false)
    

    这给了我“ArrayIndexOutOfBoundsException”错误。

  • 所有按钮总是改变 bool [5] 的 bool 值(这不存在。我通过增加声明中创建的数组的 nuber 发现了这一点)

如果我声明

    int imgbt = 0

在 for-loop eclipse 内部给了我错误:

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

(有人可以解释这个错误吗?)

所以你知道我的问题的任何解决方案,或者解决它的另一种方法,请不要犹豫!

4

3 回答 3

2

这与Android并没有太大关系,它是基本的Java。简而言之:

  • 数组从索引 0 开始
  • 对象数组(例如Boolean)默认使用nulls初始化
  • 你需要使两个数组大小相同

所以,

  • 从 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

You need to instantiate the array, like this:

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