Проверка условия нажатия на флажок - PullRequest
0 голосов
/ 28 апреля 2018

У меня 3 checkboxes на моем 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 a получите проверенные результаты:

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 голосов
/ 29 апреля 2018

Если я неправильно понял ваше требование, отредактируйте ваш вопрос, чтобы уточнить, что вы делаете в каждом утверждении 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. Например, если вы хотите установить значение true для следующих 3 комбинаций:

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

EDIT:

Итак, учитывая ваш конкретный пример, у меня есть другая идея извлечь все условия && и получить графическое представление, которое легко прочитать

Вы можете описать все свои комбинации в виде строки, где каждый символ представляет состояние флажка, «o» отмечен, «x» не проверен, «-» игнорируется. Вот примеры:

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

Тогда все ваши if могут быть удалены, и вы можете заменить их, написав:

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