检查单击复选框的条件

时间:2018-04-28 15:24:08

标签: java loops for-loop if-statement while-loop

我的checkboxes上有3 activity。我需要检查checkbox(点击/未点击)的状态,并根据此结果执行特定操作。 我在这项工作中的逻辑如下:

if(Check1.isCheked) {
    //some action
} else if(Check2.isCheked) {
    //some action
} else if (Check3.isCheked) {
    //some action
} else if ((Check1.isCheked) && (Check2.isCheked)) {
    //some action
} else if ((Check1.isCheked) && (Check3.isCheked)) {
    //some action
} // etc.

如果有更合理的方法,例如,因为我有9 checkboxes并且为了验证,我需要509个条件?

我的代码中这种情况的一个具体例子(它是我写的):

if (some_variable  == 1) {
        Intent intent = new Intent(this, activity.class);
        intent.putExtra("1", mCheck1.isChecked());
        intent.putExtra("2", (mCheck1.isChecked()) && (mCheck2.isChecked()));
        //and other 507 variants
        startActivity(intent);
} else if (some_variable == 2) {
        Intent intent1 = new Intent(this, activity.class);
        intent.putExtra("3", mCheck1.isChecked());
        intent.putExtra("4", (mCheck1.isChecked()) && (mCheck2.isChecked()));
        //and other 507 variants
        startActivity(intent1);
}

在下一个activity中,获取此检查结果:

Boolean check1 = getIntent().getExtras().getBoolean("1");
Boolean check2 = getIntent().getExtras().getBoolean("2");

Boolean check3 = getIntent().getExtras().getBoolean("3");
Boolean check4 = getIntent().getExtras().getBoolean("4");

然后我开始for循环检查此结果:

if(check1) {
//query the database
} else if (check2) {
//query the database
} else if...

1 个答案:

答案 0 :(得分:2)

如果我的要求有误,请通过提供示例编辑您的问题,以澄清您在每个if语句中的行为)

如果我的最新评论是正确的,并且您在每个评论中所做的只是通过BooleanIntent上设置putExtra值,那么您可以使用bit mask }表示选中的复选框。

每个复选框都有一点:

000000000 if nothing is checked  
000000001 if only the 1st checkbox is checked 
001001000 if 4th and 7th checkbox is checked 
etc..

然后,您可以从这些二进制数中获取每种可能组合的int表示形式。即:

int intRepresentation = 0;
if(checkbox1Checked) intRepresentation += 1;
if(checkbox2Checked) intRepresentation += 2;
if(checkbox3Checked) intRepresentation += 4;
if(checkbox4Checked) intRepresentation += 8;
if(checkbox5Checked) intRepresentation += 16;
if(checkbox6Checked) intRepresentation += 32;
if(checkbox7Checked) intRepresentation += 64;
if(checkbox8Checked) intRepresentation += 128;
if(checkbox9Checked) intRepresentation += 256;

然后,您只需要创建一个列表整数,表示要添加true的所有组合。例如,如果要为以下3种组合将值设置为true:

checkbox1 (0000001 = 1)
checkbox3 and checkbox 5 (000010100 = 20)
checkbox6 (000100000 = 64)

你做这个清单:

List<Integer> myList = Arrays.asList(1, 20, 64)

然后

int intRepresentation = // whatever value you get from your selected checkboxes

myIntent.putExtra("VALUE_NAME", myList.contains(intRepresentation))

修改

所以考虑到你的具体例子,我有另一个想法来提取所有&amp;&amp;条件并具有易于阅读的图形表示

您可以将所有组合描述为字符串,其中每个字符代表复选框的状态,&#34; o&#34;检查,&#34; x&#34;未选中,&#34; - &#34;忽视。以下是示例:

"o--------", // check1 is checked (ignore others)
"oo-------", // check1 and check2 are checked (ignore others)
"o--o-x---"  // check1 and check4 are checked and check6 is unchecked (ignore others)

然后你用它做一个数组

String[] patterns = new String[] {
    "o--------", 
    "oo-------", 
    "o--o-x---" ,
    // and 506 other ones
    };

然后获取复选框的状态,假设选中了1,4和5,您的实际情况为"oxxooxxxx"

然后,您可以定义一个方法来查看您的实际字符串是否与模式匹配

private boolean match(String actualPattern, String patternToMatch) {
    boolean match = true;
    for(int i=0; i<patternToMatch.length(); i++) {
        if(patternToMatch.charAt(i) != '-'
        && patternToMatch.charAt(i) != actualPattern.charAt(i)) {
            match = false;
        }
    }
    return true;
}

鉴于以下情况"oxxooxxxx",它将匹配模式[0]("o--------")因为复选框1被检查并且模式[2]("o--o-x---")因为复选框1和4被检查并且6不是

最后以这种方式更改代码:

Intent intent = new Intent(this, activity.class);

if (some_variable  == 1) {
    intent.putExtra("1", match(stringRepresentation, patterns[0]));
    intent.putExtra("2", match(stringRepresentation, patterns[1]));
    //and other 507 variants
} else if (some_variable == 2) {
    intent.putExtra("3", match(stringRepresentation, patterns[0]));
    intent.putExtra("4", match(stringRepresentation, patterns[1]));
    //and other 507 variants
}

startActivity(intent);

进一步简化:

如果看起来你的ifs中的代码是相同的,并且只有附加内容的名称不同,你可以通过这种方式替换所有ifs来进一步简化代码:

制作一张地图,列出some_variable的每个可能值的附加名称。在上面写的例子中,它看起来像这样。

Map<Integer, String[]> extraNames = new HashMap<Integer, String[]>() {{
    put(1, new String[] {"1", "2"});
    put(2, new String[] {"3", "4"});
}};

然后可以移除所有ifs,您可以通过写下来替换它们:

intent.putExtra(extraNames[some_variable][0], match(stringRepresentation, patterns[0]));
intent.putExtra(extraNames[some_variable][1], match(stringRepresentation, patterns[1]));
//etc .. 

它有效,我想我们甚至可以更进一步写下

for(int i=0; i<extraNames.keySet().size(); i++) {
    intent.putExtra(extraNames[some_variable][i], match(stringRepresentation, patterns[i]));
}