Диалоговое окно Android Checkbox (Easy)

У меня есть диалог с флажками, и я пытался делать разные вещи, когда выбираются опции и когда все в порядке. Я думал, что знаю, что я делаю после прочтения некоторых уроков, но когда я нажимаю, это просто тосты «Все», даже если они не проверяются. Поэтому кажется, что мои инструкции 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(); } 

Solutions Collecting From Web of "Диалоговое окно Android Checkbox (Easy)"

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

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

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

Поэтому, если вы проверите два элемента из трех, то CheCked будет содержать 2 элемента, а при вызове 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 , вы найдете это решение:

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

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

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

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

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

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