Iterator替换if / else Android Java

时间:2018-02-23 12:29:10

标签: java android

我有以下代码行。我需要检查每个按钮(有4个:a,b,c,d)并比较答案是否正确。如果是,我说该按钮将其颜色设置为绿色。

但我需要使用迭代器或类似的东西来减少这些代码,因为如果增加按钮的数量会更复杂。

if(currentQuestion.getOptA().equals(currentQuestion.getAnswer()))
{
    buttonA.setBackgroundColor(ContextCompat.getColor(getApplicationContext(),R.color.lightGreen));
} else if(currentQuestion.getOptB().equals(currentQuestion.getAnswer()))
{
    buttonB.setBackgroundColor(ContextCompat.getColor(getApplicationContext(),R.color.lightGreen));
} else if(currentQuestion.getOptC().equals(currentQuestion.getAnswer()))
{
    buttonC.setBackgroundColor(ContextCompat.getColor(getApplicationContext(),R.color.lightGreen));
} else if(currentQuestion.getOptD().equals(currentQuestion.getAnswer()))
{
    buttonD.setBackgroundColor(ContextCompat.getColor(getApplicationContext(),R.color.lightGreen));
}

4 个答案:

答案 0 :(得分:2)

一般的想法是:

1)获取按钮的count

2)制作array并放入要检查的var的动态部分内,例如a,b,c,d

3)使用for来迭代from 0 to count of buttons

4)每次通过连接名称的静态部分加上数组的动态部分来比较名称,例如getOpt是静态的,a,b c,d是名称的动态部分

所以,这个"技术"只需向array a,b,c,d添加新值,您就可以毫不费力地扩展支票。

答案 1 :(得分:1)

Object possibleAnswers [] = {currentQuestion.getOptA(), currentQuestion.getOptB(), currentQuestion.getOptC(), currentQuestion.getOptD()};
Button buttons [] = {buttonA, buttonB, buttonC, buttonD};

for (int i = 0; i < possibleAnswers.lenght; i++) {
    if (currentQuestion.getAnswer().equals(possibleAnswers[i]) {
        buttons[i].setBackgroundColor(ContextCompat.getColor(getApplicationContext(),R.color.lightGreen));
        break;
    }
}

您还可以在Question类中创建一个方法来返回选择数组......类似于:

public Object [] getPossibleAnswers() {
    return new Object[] {currentQuestion.getOptA(), currentQuestion.getOptB(), currentQuestion.getOptC(), currentQuestion.getOptD()};
}

然后,

Object possibleAnswers [] = currentQuestion.getPossibleAnswers();

注意

我使用了Object,因为我不知道你班级的名字。

答案 2 :(得分:0)

由于您似乎正在检查一件事并设置另一件事(彼此对应),您应该选择HashMap

然后,您将迭代地图(存储键和值组合),如果键与正确答案匹配,则使用该值设置背景颜色。

public HashMap<String, JButton> getQuestionAndAnswers() {
     HashMap<String, JButton> result = new HashMap<>();
     result.put(currentQuestion.getOptA(), buttonA);
     ....
}

然后你可以像这样使用它:

HashMap<String, JButton> qaa = getQuestionAndAnswers();
foreach(String key in qaa) {
     if(key.equals(currentQuestion.getAnswer()) {            qaa.get(key).setBackgroundColor(ContextCompat.getColor(getApplicationContext(),R.color.lightGreen));
     break;
     }
}

答案 3 :(得分:0)

为了确保以下方式,我建议您使用RadioGroup并为每个radioButton使用一个选择器,并为其设置未经检查和检查的状态。

你最像这样创建一个可绘制的形状:

<item android:state_checked="true">
    <shape xmlns:android="http://schemas.android.com/apk/res/android"
        android:shape="rectangle">
        <solid
            android:color="@color/lightGreen"
      />


        <corners android:radius="2dp" />
    </shape>
</item>

<item android:state_checked="false">
    <shape xmlns:android="http://schemas.android.com/apk/res/android"
        android:shape="rectangle">
        <solid
            android:color="@color/yourOffColor"
            />
    </shape>

</item>

并在java中使用这个,当真正设置她的按钮时,如下所示: :

        rg.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(RadioGroup group, int checkedId) {
            int radioID = rg.getCheckedRadioButtonId();
            int ansID= 2; //replace your id

            radioBtn = (RadioButton) findViewById(radioID);

            if (radioID == ansID){
            radioBtn.setChecked(true);
        }}
    });

这是我在我的应用中使用的一种方式,可能对你有用