Печать нескольких имен флажков только тогда, когда они отмечены - PullRequest
0 голосов
/ 03 июля 2019

У меня есть список флажков, и я хочу печатать их имена каждый раз, когда нажимаю кнопку показать сообщение.Сообщение отображается как android.widget.Toast.Если установлены несколько флажков, я хотел бы вывести их все в одну строку.Я использую оператор switch-case, чтобы определить, какие флажки нажаты, и в случаях добавления нового имени в строку результата.

case R.id.cbox_choclate_syrup:
                if (checked)
                    tag = tag + "chocolate syrup ";
                break;

enter image description here

Здесь у меня проблема.Строка результата была создана в начале класса и после первого нажатия кнопки, для второго нажатия она содержит те же имена элементов, даже если они не отмечены.Я могу добавить больше элементов, но строка результата никогда не будет сброшена.

public void tosMessage(String message){
        Context context = getApplicationContext();
        CharSequence msg = message;
        int duration = Toast.LENGTH_SHORT;

        Toast toast = Toast.makeText(context, msg, duration);
        toast.show();
        // resetting the result string.
        tag = "Toppings: ";
    }

Как показано выше, я попытался сбросить строку результата в конце метода onClick, который принадлежит кнопке.В этом случае предыдущие проверенные элементы удаляются при втором нажатии, даже если я их не снимал.

public class MainActivity extends AppCompatActivity {

    public static String tag = "Toppings: ";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    public void onCheckboxClicked(View view) {

        // is the view now checked.
        boolean checked = ((CheckBox) view).isChecked();

        // check which checkbox is checked?
        switch (view.getId()){
            case R.id.cbox_choclate_syrup:
                if (checked)
                    tag = tag + "chocolate syrup ";
                break;
            case R.id.cbox_sprinkles:
                if (checked)
                    tag = tag + "sprinkles ";
                break;
            case R.id.cbox_crushed_nuts:
                if (checked)
                    tag = tag + "crushed nuts ";
                break;
            case R.id.cbox_cherries:
                if (checked)
                    tag = tag + "cherries ";
                break;
            case R.id.cbox_orio_cookie_crumbles:
                if (checked)
                    tag = tag + "orio cookie crumbles ";
                break;
        }
    }

    public void tosMessage(String message){
        Context context = getApplicationContext();
        CharSequence msg = message;
        int duration = Toast.LENGTH_SHORT;

        Toast toast = Toast.makeText(context, msg, duration);
        toast.show();
        tag = "Toppings: ";
    }

    public void showMsg(View view) {
        tosMessage(tag);
    }
}

Я ожидаю печатать только и проверенные имена элементов каждый раз, когда нажимаю кнопку.Пожалуйста, помогите мне найти решение для этого.

Ответы [ 3 ]

0 голосов
/ 03 июля 2019

Сначала установите флажки в вашем Java-файле

CheckBox cbox_choclate_syrup,cbox_sprinkles,cbox_crushed_nuts,cbox_cherries, cbox_orio_cookie_crumbles;

Затем скопируйте и вставьте следующие функции:

private void setupFindViewById(){
    CheckBox cbox_choclate_syrup = findViewById(R.id.cbox_choclate_syrup);
    cbox_sprinkles = findViewById(R.id.cbox_sprinkles);
    cbox_crushed_nuts = findViewById(R.id.cbox_crushed_nuts);
    cbox_cherries = findViewById(R.id.cbox_cherries);
    cbox_orio_cookie_crumbles = findViewById(R.id.cbox_orio_cookie_crumbles);    
}


private CheckBox[] getCheckBoxArray(){
    return new CheckBox[]{
        CheckBox cbox_choclate_syrup,cbox_sprinkles,cbox_crushed_nuts,cbox_cherries, cbox_orio_cookie_crumbles
    }; 
}

В вашем методе onCreate вызовите setupFindViewById ()

теперь замените ваш onCheckboxClicked метод следующим:

public void onCheckboxClicked(View view) {

     tag = "Toppings: ";
     for(CheckBox checkBox: getCheckBoxArray()){
        boolean checked = checkBox.isChecked();
        switch (checkBox.getId()){
            case R.id.cbox_choclate_syrup:
                if (checked)
                    tag = tag + "chocolate syrup ";
                break;
            case R.id.cbox_sprinkles:
                if (checked)
                    tag = tag + "sprinkles ";
                break;
            case R.id.cbox_crushed_nuts:
                if (checked)
                    tag = tag + "crushed nuts ";
                break;
            case R.id.cbox_cherries:
                if (checked)
                    tag = tag + "cherries ";
                break;
            case R.id.cbox_orio_cookie_crumbles:
                if (checked)
                    tag = tag + "orio cookie crumbles ";
                break;
        }
     }
}

Теперь все готово:

Что я сделал: Сначала нам понадобились переменные, соответствующие вашим виджетам. Затем мы создали функцию getCheckBoxArray(), которая будет возвращать массив флажков. В методе onCheckboxClicked мы перебираем массив, потому что хотим проверить состояние каждого флажка


Проблема, упомянутая в комментарии :

Однако, это не работает при втором нажатии кнопки. Позволь мне объяснить; когда я выбираю вишни и брызгает и нажимаю сообщение показать Кнопка, тост выглядит идеально с двумя начинками, которые я выбрал с флажками. Но без какой-либо цепочки на флажки (все флажки остаются такими же, как первый щелчок) и сделайте второй щелчок на кнопка, тост кажется пустым. Я думаю, мне нужен способ сбросить тег, но где?

Это происходит потому, что значение переменной тега установлено на tag = "Toppings: ";
в tosMessage(String message) метод. Если вы удалите эту строку из этого метода, она должна работать нормально.

0 голосов
/ 03 июля 2019

Когда view.getId() равен одному из случаев, оператор в том, что case выполняется и break завершает все switch-case, поэтому приложение не проверяет другие CkeckBox s.Поэтому вы должны заменить оператор switch на if-else-if.

int id= view.getId();
if(id == R.id.cbox_choclate_syrup){
    if(checked)
        tag = tag + "chocolate syrup ";
}
else if(id == R.id.cbox_sprinkles){
    if(checked)
        tag = tag + "sprinkles ";
}
else if(id == R.id.cbox_crushed_nuts){
    if(checked)
        tag = tag + "crushed nuts ";
}
else if(id == R.id.cbox_cherries){
    if(checked)
        tag = tag + "cherries ";
}
else if(id == R.id.cbox_orio_cookie_crumbles){
    if(checked)
        tag = tag + "orio cookie crumbles ";
}

Примечание: удаление операторов break не будет работать.

0 голосов
/ 03 июля 2019

Вы должны сначала проверить, было ли что-то уже выбрано, а затем изменить строку на основе этого.Я также немного изменил вашу логику.

public class MainActivity extends AppCompatActivity {

    public static String tag = "Toppings: ";

    //KEEP REFERENCE TO SELECTIONS
    boolean isCboxChoclateSyrupChecked = false;
    boolean isCboxSprinklesChecked = false;
    boolean isCboxCrushedNutsChecked = false;
    boolean isCboxCherriesChecked = false;
    boolean isCboxOrioCookieCrumblesChecked = false;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    public void onCheckboxClicked(View view) {

        // is the view now checked.
        boolean checked = ((CheckBox) view).isChecked();

        // check which checkbox is checked?
        switch (view.getId()){

            case R.id.cbox_choclate_syrup:
                if (checked){
                    isCboxChoclateSyrupChecked = true;
                }else{
                    isCboxChoclateSyrupChecked = false;
                }                        
                break;

            case R.id.cbox_sprinkles:
                if (checked){
                    isCboxSprinklesChecked = true;
                }else{
                    isCboxSprinklesChecked = false;
                }                        
                break;

            case R.id.cbox_crushed_nuts:
                if (checked){
                    isCboxCrushedNutsChecked = true;
                }else{
                    isCboxCrushedNutsChecked = false;
                }
                break;

            case R.id.cbox_cherries:
                if (checked){
                    isCboxCherriesChecked = true;
                }else{
                    isCboxCherriesChecked = false;
                }
                break;

            case R.id.cbox_orio_cookie_crumbles:
                if (checked){
                    isCboxOrioCookieCrumblesChecked = true;
                }else{
                    isCboxOrioCookieCrumblesChecked = false;
                }
                break;
        }
    }

    public void tosMessage(String messageTag){
        String getAllSelected = "";

        if (isCboxChoclateSyrupChecked){
            getAllSelected = getAllSelected + "chocolate syrup ";
        }
        if (isCboxSprinklesChecked){
            getAllSelected = getAllSelected + "sprinkles ";
        }
        if (isCboxCrushedNutsChecked){
            getAllSelected = getAllSelected + "crushed nuts ";
        }
        if (isCboxCherriesChecked){
            getAllSelected = getAllSelected + "cherries ";
        }
        if (isCboxOrioCookieCrumblesChecked){
            getAllSelected = getAllSelected + "orio cookie crumbles ";

        }

        Toast toast = Toast.makeText(getApplicationContext(), messageTag+" "+getAllSelected, Toast.LENGTH_SHORT);
        toast.show();

    }

    public void showMsg(View view) {
        tosMessage(tag);
    }
}

Если вы выбрали вишни и опрыскивание, ваш тост должен показать:

Toppings: cherries sprinkles
...