我的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...
答案 0 :(得分:2)
如果我的要求有误,请通过提供示例编辑您的问题,以澄清您在每个if语句中的行为)
如果我的最新评论是正确的,并且您在每个评论中所做的只是通过Boolean
在Intent
上设置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]));
}