使用“for循环”创建一个按钮数组,并使用里面的值来更改bool数组值

时间:2012-10-17 08:17:55

标签: java arrays

已更新)抱歉,如果这越来越像指南了。还有其他网站我应该发布吗?

我正在做一个愚蠢的游戏,我正在学习循环。我的方法类似于这个问题的最佳答案: dynamic button onclick event inside for loop 这是我的代码:(是的,我正在混合语言,对不起)

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-loop的代码来保存骰子。)

在我的代码中做了一些研究后,我发现了关于按钮循环的以下内容:

  • “imgbt”的值在第5行

    if(bool [imgbt] == false)
    

    这给了我“ArrayIndexOutOfBoundsException”-error。

  • 所有按钮总是改变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

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

所以你知道我的问题的任何解决方案,或其他解决方法,请不要犹豫!

3 个答案:

答案 0 :(得分:2)

这与Android没什么关系,它是基本的Java。简而言之:

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

所以,

  • 从0开始你的循环
  • 在使用前使用booolean[]代替Boolean[]或使用Boolean.FALSE进行初始化
  • 使两个数组大小为6

答案 1 :(得分:1)

所以你真正的问题是你在类中定义覆盖时使用了一个可变的非final的变量。因此,如果您修改代码看起来像以下一样:

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

它应该运作得很好。

答案 2 :(得分:0)

您需要实例化数组,如下所示:

Boolean bool[] = new Boolean[]{false, false, false, false, false, false, false};