如何从我的AlertDialog中获取setMultiChoiceItems的选项?

5
我正在使用来自 apidemos 的以下代码...
        return new AlertDialog.Builder(AlertDialogSamples.this)
            .setIcon(R.drawable.ic_popup_reminder)
            .setTitle(R.string.alert_dialog_multi_choice)
            .setMultiChoiceItems(R.array.select_dialog_items3,
                    new boolean[]{false, true, false, true, false, false, false},
                    new DialogInterface.OnMultiChoiceClickListener() {
                        public void onClick(DialogInterface dialog, int whichButton,
                                boolean isChecked) {

                            /* User clicked on a check box do some stuff */
                        }
                    })
            .setPositiveButton(R.string.alert_dialog_ok, new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int whichButton) {

                    /* User clicked Yes so do some stuff */
                }
            })
            .setNegativeButton(R.string.alert_dialog_cancel, new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int whichButton) {

                    /* User clicked No so do some stuff */
                }
            })
           .create();

在“/*用户点击是所以做一些事情*/”下面,我没有得到isChecked变量...然而,在“/*用户单击复选框时执行某些操作*/”部分中,我得到了isChecked。显然,我不想在复选框单击时更新我的SharedPrefs,以防用户取消。那么,我如何在setPositiveButton onClick事件中获取复选框和值呢?谢谢。
3个回答

5

使用AlertDialog类的getListView()方法获取listView。也就是说,当你在结尾调用.create()方法时,这将会获取一个新的AlertDialog。

然后使用以下方法之一:

 1. getCheckItemPositions:SparseBooleanArray
 2. getCheckedItemIds:long[]

我可以提供给你演示代码。请给我10-15分钟。


3
尝试使用以下代码:((AlertDialog) aDialogue).getListView().getCheckedItemPositions() - Tyson
1
getCheckItemPositions:SparseBooleanArray 工作得非常完美,谢谢。 - lomec

4
setMultiChoiceItems()中传递byte[]的引用。
    final boolean[] booleans = {false, true, false, true, false, false, false};

然后检查setPositiveButton()内的booleans值。

如果您需要传递此AlertDialog,则扩展AlertDialog并创建一个如1中所述的boolean字段。


有其他人可以确认这个吗?从文档上看不清楚这是什么行为,而且当我在Android 2.2上测试时,勾选复选框后数组中的值并没有改变。 - Dan Hulme
在Android 5.1上,这些值也没有被改变。 - hunyadym

0
要在AlertDialog.Builder中使用setMultiChoiceItems时获取已选项目, 您必须创建DialogInterface.OnMultiChoiceClickListener,即使onClick为空也要这样做。 只有在此条件下,第二个参数中的checkedItems才会被用于内部更新AlertController,并在退出时(即在setPositiveButton回调中)反映选中的项目。
请查看此AlertController代码:
...    
} else if (mOnCheckboxClickListener != null) {
        listView.setOnItemClickListener(new OnItemClickListener() {
            public void onItemClick(AdapterView parent, View v, int position, long id) {
                if (mCheckedItems != null) {
                    mCheckedItems[position] = listView.isItemChecked(position);
                }
                mOnCheckboxClickListener.onClick(
                        dialog.mDialogInterface, position, listView.isItemChecked(position));
            }
        });
    }
...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接