(已更新)抱歉,如果这越来越像指南了。还有其他网站我应该发布吗?
我正在做一个愚蠢的游戏,我正在学习循环。我的方法类似于这个问题的最佳答案: 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
(有人可以解释这个错误吗?)
所以你知道我的问题的任何解决方案,或其他解决方法,请不要犹豫!
答案 0 :(得分:2)
这与Android没什么关系,它是基本的Java。简而言之:
Boolean
s初始化对象数组(例如null
)所以,
booolean[]
代替Boolean[]
或使用Boolean.FALSE
进行初始化答案 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};