按钮旁边的可绘制对象? [英] Drawables next to buttons?
问题描述
我一直在开发一个简单的应用程序,该应用程序具有一项功能,可以通过回答多项选择题来测试您的知识.选择答案后(通过单选按钮),我想在所选答案的右边显示一个复选标记(如果该答案正确),或者显示"X"(如果该答案不正确).出于某种原因,我的代码在第一次尝试时效果很好,然后在选择其他答案时没有任何改变.
Ive been working on a simple app that has a feature where you can test your knowledge by answering multiple choice questions. After an answer is selected(by the radio button), i want to show either a check mark if the answer is correct, or an "X" if the answer is incorrect, to the right of the selected answer. For some reason, my code works perfectly for the first try, and then doesnt change anything when selecting other answers.
此处是代码(适配器的一部分-子视图)
heres the code (its part of an adapter - child view)
/**
* Creates the View of group(parent) in the ExpandableListView
*
* @return the View of each parent in the List
*/
@Override
public View getGroupView(final int groupPosition, final boolean isExpanded, View convertView, final ViewGroup parent) {
LayoutInflater inflater = LayoutInflater.from(context);
View parentView = inflater.inflate(R.layout.custom_list_parent, parent, false);
Question myQuestion = myList.get(groupPosition);
//setting the text of each parent
TextView singleTitle = (TextView) parentView.findViewById(R.id.title);
singleTitle.setText(myQuestion.getQuestion());
//handling the indicator
ImageView indicator = (ImageView) parentView.findViewById(R.id.indicator);
//if the list is expanded use arrow up, if not then use arrow down
int imageResourceId = isExpanded ? android.R.drawable.arrow_up_float : android.R.drawable.arrow_down_float;
//initial arrow
indicator.setImageResource(imageResourceId);
indicator.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
/**
* Will expand and collapse groups depending on previous state
* @param v the View from which the ClickListener was triggered
*/
if (isExpanded) ((ExpandableListView) parent).collapseGroup(groupPosition);
else ((ExpandableListView) parent).expandGroup(groupPosition, true);
}
});
return parentView;
}
/**
* Creates the View of child in the ExpandableListView
* @return the View of each child in the List
*/
@Override
public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
LayoutInflater inflater = LayoutInflater.from(context);
final View childView = inflater.inflate(R.layout.custom_list_child_questions, parent, false);
handleRadioButtons(childView,groupPosition);
return childView;
}
/**
* Checks if the child can be selected/pressed as well
*
* @return whether the child is selectable or not
*/
@Override
public boolean isChildSelectable(int groupPosition, int childPosition) {
return false;
}
public void handleRadioButtons(View childView, int groupPosition) {
final Question myQuestion = myList.get(groupPosition);
RadioGroup group = (RadioGroup) childView.findViewById(R.id.buttonGroup);
initializeButtons(childView);
setButtonText(myQuestion);
//if one of the buttons is pressed
group.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
/**
* Will expand and collapse groups depending on previous state
* @param group the button group this ActionListener will operate on
* @param checkedId the ID of the individual button that was pressed
*/
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
//get the index of the correct answer
int indexAnswer = Integer.parseInt(myQuestion.getAnswer()) - 1;
for (int i = 0; i < possibleAnswers.length; i++) {
//if the button at position i was pressed
if (checkedId == possibleAnswers[i].getId()) {
//if its the correct answer
if (i == indexAnswer)
possibleAnswers[i].setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.checkmark, 0);
else
possibleAnswers[i].setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.wrong, 0);
} else {
possibleAnswers[i].setCompoundDrawablesWithIntrinsicBounds(0, 0, 0, 0);
}
}
}
});
}
/**
* Sets the text of each radio button as a possible answer
* @param myQuestion the Question corresponding to the possible answers
*/
public void setButtonText(Question myQuestion) {
for (int i = 0; i < possibleAnswers.length; i++) {
possibleAnswers[i].setText(myQuestion.getPossibleAnswers()[i]);
}
}
/**
* Initializes the RadioButton array of possible answers
* @param childView the View in which the radio buttons are defined
*/
public void initializeButtons(View childView) {
//array of radioButtons, each button will correspond to a possible answer
possibleAnswers[0] = (RadioButton) childView.findViewById(R.id.answer1);
possibleAnswers[1] = (RadioButton) childView.findViewById(R.id.answer2);
possibleAnswers[2] = (RadioButton) childView.findViewById(R.id.answer3);
possibleAnswers[3] = (RadioButton) childView.findViewById(R.id.answer4);
}
}
和xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:background="#6495ED"
android:layout_width="match_parent"
android:layout_height="135dp">
<RadioGroup
android:id="@+id/buttonGroup"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<RadioButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="choice1"
android:drawablePadding="6dp"
android:textColor="#ffffff"
android:textSize="12dp"
android:id="@+id/answer1"/>
<RadioButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="choice 2"
android:drawablePadding="6dp"
android:textColor="#ffffff"
android:textSize="12dp"
android:id="@+id/answer2"/>
<RadioButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="choice 3"
android:drawablePadding="6dp"
android:textColor="#ffffff"
android:textSize="12dp"
android:id="@+id/answer3"/>
<RadioButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="choice 4"
android:drawablePadding="6dp"
android:textColor="#ffffff"
android:textSize="12dp"
android:id="@+id/answer4"
/>
</RadioGroup>
问题在屏幕上显示的样子: 问题
that's how the problem looks on the screen: problem
有什么想法吗?请帮忙!
Any ideas? Please help!
这是我现在正在做的,试图在能见度上发挥作用:
here's what im doing now, trying to play with visibility:
public void handleRadioButtons(final View childView, int groupPosition) {
final Question myQuestion = myList.get(groupPosition);
RadioGroup group = (RadioGroup) childView.findViewById(R.id.buttonGroup);
initializeButtons(childView, myQuestion);
setButtonText(myQuestion);
//if one of the buttons is pressed
group.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
/**
* Will expand and collapse groups depending on previous state
*
* @param group the button group this ActionListener will operate on
* @param checkedId the ID of the individual button that was pressed
*/
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
//get the index of the correct answer
for (int i = 0; i < possibleAnswers.length; i++) {
//if the button at position i was pressed
if (checkedId == possibleAnswers[i].getId()) {
possibleAnswers[i].getCompoundDrawables()[2].setVisible(true,true);
}
}
}
});
}
/**
* Initializes the RadioButton array of possible answers
* @param childView the View in which the radio buttons are defined
*/
public void initializeButtons(View childView,Question myQuestion) {
//array of radioButtons, each button will correspond to a possible answer
possibleAnswers[0] = (RadioButton) childView.findViewById(R.id.answer1);
possibleAnswers[1] = (RadioButton) childView.findViewById(R.id.answer2);
possibleAnswers[2] = (RadioButton) childView.findViewById(R.id.answer3);
possibleAnswers[3] = (RadioButton) childView.findViewById(R.id.answer4);
for(int i=0;i<possibleAnswers.length;i++){
if(Integer.parseInt(myQuestion.getAnswer()) - 1 == i){
possibleAnswers[i].setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.checkmark, 0);
possibleAnswers[i].getCompoundDrawables()[2].setVisible(false,true);
}
else{
possibleAnswers[i].setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.wrong, 0);
possibleAnswers[i].getCompoundDrawables()[2].setVisible(false,true);
}
}
}
推荐答案
您可以在每个单选按钮旁边添加图片,在正确答案旁边添加绿色复选标记,在错误答案旁边添加红色X,以编程方式全部使用setVisibility(GONE);
当您想显示正确答案时,仅setVisibility(VISIBLE)
仅显示正确答案和所选答案
you can add an image beside every radiobutton, green check beside the correct answer and red X beside the wrong answer, make them all with setVisibility(GONE);
programatically, and when you want to show the correct answers just setVisibility(VISIBLE)
only for the correct answer and the chosen answer
这篇关于按钮旁边的可绘制对象?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!