Drawables next to buttons?

≡放荡痞女 提交于 2019-12-11 05:31:48

问题


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);
}

}

and the 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!

EDIT:

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);

        }

    }
}

回答1:


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



来源:https://stackoverflow.com/questions/39339130/drawables-next-to-buttons

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!