英文:
Change bgcolor when click button
问题
当答案按钮被点击时,应该将其背景颜色更改为不同的颜色。我是这样实现的:
selectionBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// 正确答案被点击
if (checkChosen(questionProgress, selectionBtn.getText().toString())) {
// 将背景颜色更改为绿色,表示用户选择了正确答案
selectionBtn.setBackgroundResource(R.drawable.correct_button_selected);
// 将背景颜色保持0.3秒
selectionBtn.postDelayed(new Runnable() {
@Override
public void run() {
selectionBtn.setBackgroundResource(R.drawable.choice_button_border);
}
}, 300);
} else {
// 错误答案被点击
selectionBtn.setBackgroundResource(R.drawable.wrong_button_selected);
selectionBtn.postDelayed(new Runnable() {
@Override
public void run() {
selectionBtn.setBackgroundResource(R.drawable.choice_button_border);
}
}, 300);
}
// 进度增加
questionProgress++;
/**
* 进度等于问题数量,表示最后一个问题
* 显示提交按钮
/
if (questionProgress == questionAmount) {
binding.submitBtn.setVisibility(View.VISIBLE);
binding.progressBar.setProgress(binding.progressBar.getMax());
binding.progressCount.setText(questionAmount + " / " + questionAmount);
}
/*
* 进度 < 数量,移除上一个问题的答案按钮
* 添加新的答案按钮,并更改进度条
*/
if (questionProgress < questionList.length) {
Log.v("progress", String.valueOf(questionProgress));
binding.progressBar.setProgress(questionProgress);
binding.progressCount.setText(questionProgress + " / " + questionAmount);
binding.quizContent.setText(questionList[questionProgress]);
binding.selectionLayout.removeAllViews();
String[] anLi = answerMap.get(questionProgress);
for (int i = 0; i < anLi.length - 1; i++) {
addSelections(anLi[i]);
}
}
}
});
然而,用这种方式只有最后一个问题的答案按钮在被点击时才会改变背景颜色。
如何解决这个问题?提前感谢。
英文:
I'm using Android to create a Quiz application. So far, most of the things are done. Only one problem. When the answer button is clicked, its background color should be changed to a different color.
I implement in this way:
selectionBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// correct answer clicked
if (checkChosen(questionProgress, selectionBtn.getText().toString())) {
// change the bg-color to green indicates user made correct choice
selectionBtn.setBackgroundResource(R.drawable.correct_button_selected);
// last the bg-color for 0.3s
selectionBtn.postDelayed(new Runnable() {
@Override
public void run() {
selectionBtn.setBackgroundResource(R.drawable.choice_button_border);
}
}, 300);
} else {
// wrong answer clicked
selectionBtn.setBackgroundResource(R.drawable.wrong_button_selected);
selectionBtn.postDelayed(new Runnable() {
@Override
public void run() {
selectionBtn.setBackgroundResource(R.drawable.choice_button_border);
}
}, 300);
}
// progress added
questionProgress++;
/**
* progress equals the amount, means the last question
* show the submit button
*/
if (questionProgress == questionAmount) {
binding.submitBtn.setVisibility(View.VISIBLE);
binding.progressBar.setProgress(binding.progressBar.getMax());
binding.progressCount.setText(questionAmount + " / " + questionAmount);
}
/**
* progress < amount, remove answer buttons of the last question
* add new answer buttons and change progress bar
*/
if (questionProgress < questionList.length) {
Log.v("progress", String.valueOf(questionProgress));
binding.progressBar.setProgress(questionProgress);
binding.progressCount.setText(questionProgress + " / " + questionAmount);
binding.quizContent.setText(questionList[questionProgress]);
binding.selectionLayout.removeAllViews();
String[] anLi = answerMap.get(questionProgress);
for (int i = 0; i < anLi.length - 1; i++) {
addSelections(anLi[i]);
}
}
}
});
However, in this way, only answer buttons for the last question will change bg-color when they are clicked.
How can I solve this problem? Thanks in advance.
答案1
得分: 0
你可以在onClick方法中像下面的代码片段中一样使用view。
selectionBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(final View view) {
if (checkChosen(questionProgress, selectionBtn.getText().toString())) {
view.setBackgroundResource(R.drawable.correct_button_selected);
final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
view.setBackgroundResource(R.drawable.choice_button_border);
}
}, 200);
} else {
// else condition
}
}
});
英文:
You can use view from onClick method like in the code snippet below.
selectionBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(final View view) {
if (checkChosen(questionProgress, selectionBtn.getText().toString())) {
view.setBackgroundResource(R.drawable.correct_button_selected);
final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
view.setBackgroundResource(R.drawable.choice_button_border);
}
}, 200);
} else {
// else condition
}
}
});
答案2
得分: 0
你似乎在为每个答案创建新按钮时重复使用了 selectionBtn
变量。当延迟运行开始时,selectionBtn
的值将不同,它将指向您创建的最后一个按钮。
要修复这个问题,可以使用 onClick()
方法的参数,实际上它是触发事件的视图(也就是您正确的按钮):
selectionBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
final Button currentButton = (Button) view;
if (checkChosen(questionProgress, currentButton.getText().toString())) {
currentButton.setBackgroundResource(R.drawable.correct_button_selected);
} else {
currentButton.setBackgroundResource(R.drawable.wrong_button_selected);
}
currentButton.postDelayed(new Runnable() {
@Override
public void run() {
currentButton.setBackgroundResource(R.drawable.choice_button_border);
}
}, 300);
....
}
英文:
You seem to reuse selectionBtn
variable while creating new button for each answer, when your delayed runnable starts, the value of selectionBtn
will be different and it will be pointing the last button you created.
To fix that, use the onClick()
's argument, which actually is the view that triggered the event (which is your correct button):
selectionBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
final Button currentButton = (Button) view;
if (checkChosen(questionProgress, currentButton.getText().toString())) {
currentButton.setBackgroundResource(R.drawable.correct_button_selected);
} else {
currentButton.setBackgroundResource(R.drawable.wrong_button_selected);
}
currentButton.postDelayed(new Runnable() {
@Override
public void run() {
currentButton.setBackgroundResource(R.drawable.choice_button_border);
}
}, 300);
....
}
答案3
得分: 0
我已修复了它。问题出在 removeAllViews()
上。在添加新按钮之前,它会移除所有答案按钮的视图,这会导致闪烁不可见,因为它被移除。
这是我修复它的方式。
英文:
I have fixed it. The problem is removeAllViews()
. It removes the whole views for answer buttons before add new buttons, and that makes the flash not visible cause it's removed.
if (questionProgress < questionList.length) {
Log.v("progress", String.valueOf(questionProgress));
binding.progressBar.setProgress(questionProgress);
binding.progressCount.setText(questionProgress + " / " + questionAmount);
binding.quizContent.setText(questionList[questionProgress]);
binding.selectionLayout.postDelayed(new Runnable() {
@Override
public void run() {
binding.selectionLayout.removeAllViews();
String[] anLi = answerMap.get(questionProgress);
for (int i = 0; i < anLi.length - 1; i++) {
addSelections(anLi[i]);
}
}
}, 300);
}
This is how I fixed it.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论