Подтвердить что ты не робот

Диалоговое окно с флажком Android (просто)

У меня есть диалоговое окно с флажками, и я пытался делать разные вещи, когда выбраны опции и когда нажата OK.

Я думал, что знаю, что делаю, после прочтения некоторых руководств, но когда я нажимаю OK, он просто произносит "Все", даже если не проверено. Таким образом, кажется, что мои заявления if не работают правильно, но я не знаю почему.

Что я делаю не так и как мне это исправить?

    final CharSequence[] items = {"Item 1", "Item 2", "Item 3"};
    final boolean[] states = {false, false, false};
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setTitle("What would you like to do?");

    builder.setMultiChoiceItems(items, states, new DialogInterface.OnMultiChoiceClickListener(){
        public void onClick(DialogInterface dialogInterface, int item, boolean state) {
        }
    });

    builder.setPositiveButton("Okay", new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int id) {
            SparseBooleanArray CheCked = ((AlertDialog)dialog).getListView().getCheckedItemPositions();
            if(CheCked.get(CheCked.keyAt(0)) == true){
                Toast.makeText(Backup.this, "Item 1", Toast.LENGTH_SHORT).show();
            }
            if(CheCked.get(CheCked.keyAt(1)) == true){
                Toast.makeText(Backup.this, "Item 2", Toast.LENGTH_SHORT).show();
            }
            if(CheCked.get(CheCked.keyAt(2)) == true){
                Toast.makeText(Backup.this, "Item 3", Toast.LENGTH_SHORT).show();
            }
        }
    });

    builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int id) {
             dialog.cancel();
        }
    });

    builder.create().show();
}
4b9b3361

Ответ 1

Проблема в том, что вы используете keyAt, который, согласно документации API

возвращает ключ из сопоставления ключ-значение indexth, которое хранит этот SparseBooleanArray.

и этот SparseBooleanArray содержит только проверенные элементы вашего списка (getCheckedItemPositions)!

Таким образом, если вы проверите два элемента из трех, то член CheCked будет содержать два элемента, и при вызове keyAt(2) он вернет 0 (не IndexOutOfBoundsException, хотя в этой позиции карта не содержит значения).

Вы должны просто использовать метод get этого SparseBooleanArray, с позициями элементов из вашего ListView качестве аргументов:

builder.setPositiveButton("Okay", new DialogInterface.OnClickListener()
{
    public void onClick(DialogInterface dialog, int id)
    {
        SparseBooleanArray CheCked = ((AlertDialog) dialog).getListView().getCheckedItemPositions();
        if (CheCked.get(0))
        {
            Toast.makeText(TmpActivity2.this, "Item 1", Toast.LENGTH_SHORT).show();
        }
        if (CheCked.get(1))
        {
            Toast.makeText(TmpActivity2.this, "Item 2", Toast.LENGTH_SHORT).show();
        }
        if (CheCked.get(2))
        {
            Toast.makeText(TmpActivity2.this, "Item 3", Toast.LENGTH_SHORT).show();
        }
    }
});

Вы также можете потерять == true часть предложения if, но это только семантика.

Если вы посмотрите на документацию API метода getCheckedItemPositions, вы найдете это решение:

Возвращает:
SparseBooleanArray который будет возвращать true для каждого вызова get(int position) где position - это позиция в списке, или null если режим выбора установлен в CHOICE_MODE_NONE.

Ответ 2

Я бы сделал это так, например:

public class Main extends Activity {

    CharSequence[] items = {"Google", "Apple", "Microsoft"};
    boolean[] itemsChecked = new boolean[items.length];

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        Button btn = (Button) findViewById(R.id.btnDialog);
        btn.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                showDialog(0);
            }
        });
    }

    @Override
    protected Dialog onCreateDialog(int id) {
        switch (id) {
        case 0:
            return new AlertDialog.Builder(this)
            .setIcon(R.drawable.icon)
            .setTitle("Dialog with simple text")
            .setPositiveButton("OK", new DialogInterface.OnClickListener() {

                @Override
                public void onClick(DialogInterface dialog, int which) {
                    for (int i = 0; i < items.length; i++) {
                    if (itemsChecked[i]) {
                        Toast.makeText(getBaseContext(), items[i] + " checked!", Toast.LENGTH_LONG).show();
                    }
                }
                }
            })
            .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {

                @Override
                public void onClick(DialogInterface dialog, int which) {
                    Toast.makeText(getBaseContext(), "Cancel clicked!", Toast.LENGTH_LONG).show();
                }
            })
            .setMultiChoiceItems(items, itemsChecked, new DialogInterface.OnMultiChoiceClickListener() {

                @Override
                public void onClick(DialogInterface dialog, int which, boolean isChecked) {
                    Toast.makeText(getBaseContext(), items[which] + (isChecked ? "checked!" : "unchecked!"), Toast.LENGTH_SHORT).show();
                }
            })
            .create();
        }

        return null;
    }


}

Ответ 3

Это должно помочь:

.setMultiChoiceItems(
    items, itemsChecked,
    new DialogInterface.OnMultiChoiceClickListener() {
        @Override
        public void onClick(DialogInterface dialog,
                            int which, boolean isChecked) {
            Toast.makeText(
                getBaseContext(),
                items[which]
                        + (isChecked ? " checked!"
                                : " unchecked!"),
                Toast.LENGTH_SHORT).show();
        }
    }
)

Но тогда как вы используете проверенные предметы в другом классе?