我有16个空白方块,我想每1秒随机显示一个红色方块,所以我使用了处理程序,这是有效的。 但是,当用户点击此红色方块时,分数会增加1。 我试图添加onclicklistener来命名,但这不是我需要的,因为一旦正方形背景为红色,得分增加1即使它返回白色所以我试图添加点击监听器到每个imageView从第一个开始但没有任何反应;当我点击它时应用程序崩溃所以我该怎么办?## Heading ##
代码:
Drawable RedSquare;
ImageView Image1;
TextView res;
Random random = new Random();
int score = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
MediaPlayer mp =MediaPlayer.create(getApplicationContext(),R.raw.mp);
mp.start();
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_reflex);
RedSquare = getResources().getDrawable(R.mipmap.redsquare);
Image1 = (ImageView) findViewById(R.id.imageView1);
ImageView Image2 = (ImageView) findViewById(R.id.imageView2);
ImageView Image3 = (ImageView) findViewById(R.id.imageView3);
ImageView Image4 = (ImageView) findViewById(R.id.imageView4);
ImageView Image5 = (ImageView) findViewById(R.id.imageView5);
ImageView Image6 = (ImageView) findViewById(R.id.imageView6);
ImageView Image7 = (ImageView) findViewById(R.id.imageView7);
ImageView Image8 = (ImageView) findViewById(R.id.imageView8);
ImageView Image9 = (ImageView) findViewById(R.id.imageView9);
ImageView Image10 = (ImageView) findViewById(R.id.imageView10);
ImageView Image11 = (ImageView) findViewById(R.id.imageView11);
ImageView Image12 = (ImageView) findViewById(R.id.imageView12);
ImageView Image13 = (ImageView) findViewById(R.id.imageView13);
ImageView Image14 = (ImageView) findViewById(R.id.imageView14);
ImageView Image15 = (ImageView) findViewById(R.id.imageView15);
ImageView Image16 = (ImageView) findViewById(R.id.imageView16);
res = (TextView) findViewById(R.id.reflexresult);
final ImageView[] Image = {Image1, Image2, Image3, Image4, Image5, Image6,
Image7, Image8, Image9, Image10, Image11, Image12, Image13, Image14, Image15, Image16};
final Handler handler = new Handler();
Runnable runnable = new Runnable() {
@Override
public void run() {
GeneratePosition(Image);
handler.postDelayed(this, 1000);
}
};
handler.postDelayed(runnable, 1000);
addScore();
}
public void GeneratePosition(ImageView[] Image) {
int index = random.nextInt(Image.length);
ImageView name = Image[index];
for (ImageView imageView : Image) {
imageView.setImageDrawable(getResources().getDrawable(R.mipmap.blanksquare));
}
name.setImageDrawable(getResources().getDrawable(R.mipmap.redsquare));
}
public void addScore(){
Image1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if(Image1.getBackground().equals(RedSquare)){
score++;
res.setText(score+"");
}
}
});
}
}
答案 0 :(得分:0)
为什么要比较背景?只需将当前显示红色背景的ImageView的引用保存为int main(void)
方法中的字段。
在on click侦听器中,您将获得所单击视图的引用。您所要做的就是将其与之前保存的参考值进行比较。
答案 1 :(得分:0)
以下是我将如何保存此问题的示例实现。它为应该单击的视图添加了一个侦听器。如果用户长时间点击突出显示的ImageView,它将突出显示一个新的。如果用户及时点击突出显示的ImageView,则点会更新,并立即突出显示下一个ImageView。
private static final int TIMEOUT_IN_MILLIS = 1000;
private static final int POINTS_PER_CORRECT_CLICK = 1;
private static final Handler HANDLER = new Handler();
private static final Random RANDOM = new Random();
private final Runnable startRoundOnTimeoutRunnable = new StartRoundOnTimeoutRunnable();
private final View.OnClickListener correctImageViewClickListener = new CorrectImageViewClickListener();
private final List<ImageView> availableImageViews;
private final TextView scoreDisplay;
private final Drawable blackSquare;
private final Drawable redSquare;
private int score = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// initialization of all views
// and
// assembling of availableImageViews list
startNewRound();
}
public void startNewRound() {
resetAllImageViews();
initializeNextImageViewToClick();
startTimeout();
}
private void initializeNextImageViewToClick() {
ImageView imageViewToClick = getRandomImageView();
imageViewToClick.setBackground(redSquare);
imageViewToClick.setOnClickListener(correctImageViewClickListener);
}
private void resetAllImageViews() {
for (ImageView imageView : availableImageViews) {
imageView.setImageDrawable(blackSquare);
imageView.setOnClickListener(null);
}
}
private ImageView getRandomImageView() {
int index = RANDOM.nextInt(availableImageViews.size());
return availableImageViews.get(index);
}
private void incrementAndDisplayScore() {
score += POINTS_PER_CORRECT_CLICK;
scoreDisplay.setText("Score: " + score);
}
private void startTimeout() {
HANDLER.postDelayed(startRoundOnTimeoutRunnable, TIMEOUT_IN_MILLIS);
}
private void cancelTimeout() {
HANDLER.removeCallbacks(startRoundOnTimeoutRunnable);
}
private class CorrectImageViewClickListener implements View.OnClickListener {
@Override
public void onClick(View view) {
cancelTimeout();
incrementAndDisplayScore();
startNewRound();
}
}
private class StartRoundOnTimeoutRunnable implements Runnable {
@Override
public void run() {
startNewRound();
}
}