gpt4 book ai didi

java - 按钮不执行正确的命令[编辑]

转载 作者:太空宇宙 更新时间:2023-11-04 14:04:47 25 4
gpt4 key购买 nike

所以我试图制作一个应用程序,其中有一个 ImageView 可以显示图像列表中的随机图像。还有两个按钮,根据图像,需要按下正确的按钮。如此持续下去,您就会获得分数,直到您得到错误的答案。

我使用异步方法在 ImageView 中随机显示图像,并在按钮上设置条件。但是,当我运行该应用程序时,该条件仅适用于显示的第一张图像。之后,无论显示什么图像,按钮条件都会像显示第一个图像一样工作。

这是代码

public class Game extends ActionBarActivity {

static TextView timeDisplay;
int[] cardGallery = {R.drawable.tile0, R.drawable.tile1, R.drawable.tile2, R.drawable.tile3, R.drawable.tile4, R.drawable.tile5, R.drawable.tile6, R.drawable.tile7, R.drawable.tile8, R.drawable.tile9};
int score = 0;
int imageId = (int) (Math.random() * cardGallery.length);

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_game);

ImageView cardImageView = (ImageView) findViewById(R.id.cardImage);
ImageButton bigButton = (ImageButton) findViewById(R.id.upButton);
ImageButton smallButton = (ImageButton)findViewById(R.id.downButton);
final TextView scoreDisplay = (TextView)findViewById(R.id.scoreMessage);

timeDisplay = (TextView) findViewById(R.id.timerMessage);
cardImageView.setImageResource(cardGallery[imageId]);
scoreDisplay.setText("Current score: " + score);

.
.
.

bigButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
/* may need to implement switch and cases for each button
switch (cardGallery[imageId]){
case R.drawable.tile0:
GameTimer.onFinish();
}*/

if (imageId == 0) {
GameTimer.cancel();
GameTimer.onFinish();
}
else if (imageId == 1) {
GameTimer.cancel();
GameTimer.onFinish();
}
else if (imageId == 2) {
GameTimer.cancel();
GameTimer.onFinish();
}
else if (imageId == 3) {
GameTimer.cancel();
GameTimer.onFinish();
}
else if (imageId == 4) {
GameTimer.cancel();
GameTimer.onFinish();
}
else if (imageId == 5) {
GameTimer.start();
scoreDisplay.setText("Current score: " + ++score);
new CardAsyncTask().execute();
}
else if (imageId == 6) {
GameTimer.start();
scoreDisplay.setText("Current score: " + ++score);
new CardAsyncTask().execute();
}
else if (imageId == 7) {
GameTimer.start();
scoreDisplay.setText("Current score: " + ++score);
new CardAsyncTask().execute();
}
else if (imageId == 8) {
GameTimer.start();
scoreDisplay.setText("Current score: " + ++score);
new CardAsyncTask().execute();
}
else if (imageId == 9) {
GameTimer.start();
scoreDisplay.setText("Current score: " + ++score);
new CardAsyncTask().execute();
}
else {
GameTimer.cancel();
GameTimer.onFinish();
}
}});

smallButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (imageId == 0) {
GameTimer.start();
scoreDisplay.setText("Current score: " + ++score);
new CardAsyncTask().execute();
}
else if (imageId == 1) {
GameTimer.start();
scoreDisplay.setText("Current score: " + ++score);
new CardAsyncTask().execute();
}
else if (imageId == 2) {
GameTimer.start();
scoreDisplay.setText("Current score: " + ++score);
new CardAsyncTask().execute();
}
else if (imageId == 3) {
GameTimer.start();
scoreDisplay.setText("Current score: " + ++score);
new CardAsyncTask().execute();
}
else if (imageId == 4) {
GameTimer.start();
scoreDisplay.setText("Current score: " + ++score);
new CardAsyncTask().execute();
}
else if (imageId == 5) {
GameTimer.cancel();
GameTimer.onFinish();
}
else if (imageId == 6) {
GameTimer.cancel();
GameTimer.onFinish();
}
else if (imageId == 7) {
GameTimer.cancel();
GameTimer.onFinish();
}
else if (imageId == 8) {
GameTimer.cancel();
GameTimer.onFinish();
}
else if (imageId == 9) {
GameTimer.cancel();
GameTimer.onFinish();
}
else {
GameTimer.cancel();
GameTimer.onFinish();
}
}
});




}





class CardAsyncTask extends AsyncTask<Integer, Void, Integer> {

@Override
protected Integer doInBackground(Integer... params) {
int imageId = (int) (Math.random() * cardGallery.length);
return imageId;
}

@Override
protected void onPostExecute(Integer imageId) {
ImageView cardImageView = (ImageView) findViewById(R.id.cardImage);
cardImageView.invalidate();
cardImageView.setImageResource(cardGallery[imageId]);
}

}

}

我认为这是因为我已将新旧 imageId 值声明为相同,但如果我将它们更改为 imageId 和 newimageId,这将更改我的代码中要求与 imageId 进行比较的值的条件。谢谢

最佳答案

您有多个名为 imageId 的变量。这是发生的事情:

1) 在 Game 类中声明一个名为 imageId 的变量,其中包含以下行:

int imageId = (int) (Math.random() * cardGallery.length);

这是代码示例中的第六行。 Game 类的每个实例都会有一个名为 imageId 的成员,该成员在创建实例时(即创建您的 Activity 时)分配一个随机值。

2) 在 CardAsyncTask 类的 doInBackground 方法中,声明一个局部变量(也称为 imageId),并为其分配一个随机值。由于您已声明局部变量,因此为其赋值不会对 Game 类中存储的 imageId 变量产生任何影响。然后,从该方法返回 doInBackground 中的 imageId,并由 AsyncTask 作为参数传递给 onPostExecute 方法,您可以在其中使用它来更新 ImageView 。

您的两个选择是:

a) 从 doInBackground 内的变量声明中删除“int”,这样 doInBackground 任务将修改 Game 类实例中的 imageId,而不是在函数内创建局部变量。然而,这是一个坏主意。由于 doInBackground 在后台线程上运行,因此可能会发生以下事件序列:

  • doInBackground 运行,并修改 imageId
  • 用户然后在 onPostExecute 运行之前按下按钮。将显示旧图像,但新的 imageId 已设置。
  • 然后将运行 onPostExecute,将图像设置为新图像。

诚然,用户可能不会注意到它发生了无序,但在使用异步进程时最好考虑这些事情。

b) 更好的选择是在 onPostExecute 中更改图像时将 Game 实例的 imageId 字段设置为新的 imageId。该函数中还有一个名为 imageId 的局部变量,它是已传入的参数。我的建议是:

在doInBackground中,将imageId重命名为newImageId:

protected Integer doInBackground(Integer... params) {
int newImageId = (int) (Math.random() * cardGallery.length);
return newImageId;
}

然后在onPostExecute中,将新的图像ID分配给Game类中的字段:

protected void onPostExecute(Integer newImageId) {
ImageView cardImageView = (ImageView) findViewById(R.id.cardImage);
cardImageView.invalidate();
cardImageView.setImageResource(cardGallery[newImageId]);
imageId = newImageId;
}

关于java - 按钮不执行正确的命令[编辑],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28979931/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com