如何获取单选对话框中所选项目?

48

我有这段代码可以显示单选对话框(radio)选项。

AlertDialog ad = new AlertDialog.Builder(this)
.setCancelable(false)
.setIcon(R.drawable.alert_dialog_icon)
.setTitle(R.string.choose_one)
.setSingleChoiceItems(seq, pos,null)
.setPositiveButton( R.string.ok, new DialogInterface.OnClickListener() { 
  public void onClick( DialogInterface dialog, int whichButton) 
  { 
    // dialog dismissed
  } 
 }).create();

如何获取已选择的选项?


int whichButton:为什么它不起作用? - exploitr
7个回答

122

我知道这是一个旧帖子,但我刚看到它,并发现这个解决方案似乎比在这里发布的更简单。

您只需像这样执行:

在对话框正按钮的 onClick() 处理程序中,添加以下代码:

ListView lw = ((AlertDialog)dialog).getListView();
Object checkedItem = lw.getAdapter().getItem(lw.getCheckedItemPosition());

注意:如果您没有选择任何选项,它将会崩溃,只有在获取checkedItem之前添加检查,if(lw.getCheckedItemCount() > 0)


1
运行得非常好!值得加一。 - Garima Tiwari
那是在关闭AlertDialog时。下次调用它时,我怎么取回它? - Si8
9
针对AlertDialog中的正面或负面列表选择,最佳解决方案是使用 which = -1。感谢+1! - falvojr
9
请注意,对于单选按钮,应该使用getCheckedItemPosition()而不是getSelectedItemPosition(),后者总是返回-1,非常令人困惑! - jakub.g
1
这是一个血腥的女巫。 - Faizan Mubasher
显示剩余4条评论

15

我曾试图使用 ListView.setSelection(int),但它从未按预期工作,因此我决定改用 View.setTag() 临时存储所选位置。

.setSingleChoiceItems(adapter, -1,
        new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int which) {
            ListView lv = ((AlertDialog)dialog).getListView();
            lv.setTag(new Integer(which));
        }
})

之后,就可以轻松访问该标签。

.setPositiveButton(R.string.button_text,
    new DialogInterface.OnClickListener() {
    public void onClick(DialogInterface dialog, int which) {
        ListView lv = ((AlertDialog)dialog).getListView();
        Integer selected = (Integer)lv.getTag();
        if(selected != null) {
            // do something interesting
        }
    }
})

我想确认这里的 adapter 可以是任何适配器(BaseAdapterArrayAdapter 等)吗?我使用了您的代码并尝试了 BaseAdapter,但它没有起作用。 - Yogesh Seralia
对我来说非常有效。 - Shamsul Arefin
在 Xamarin.Android 上使用。运行完美。 - gregoryp

3

我相信您使用OnClickListener来监听setSingleChoiceItems()中的选择事件;当用户点击确定后,您可以将所选项固定下来。目前您只是传递了空值,因此无法确定选择了哪个项目。


2
那么你的意思是说当事件触发时,我需要暂时存储该项,而在对话框关闭时进行保存? - Pentium10
我猜从理论上讲,你可以做一些更高级的事情;我想知道AlertDialog.getListView()是否会获取选择列表,然后您可以解析出哪些项目已选中。但是,这似乎比在事件触发时临时存储该项要多做很多工作。 - Dan Lew
你可以使用 AlertDialog.getListView().getSelectedItem(),但那似乎并没有给我想要的结果。 - Ian McLaird

1

1). 创建数组。

final ArrayList<String> arrData = new ArrayList<String>();

2). 将数据添加到您创建的数组中。

if (cursor != null) {
            if (cursor.moveToFirst()) {
                do {

                    arrData .add(cursor.getString(1)); 
                                             // (1 = int columnIndex)

                } while (cursor.moveToNext());
            }
        }

3). 获取数据如下。

public void onClick(DialogInterface dialog, int item) {

                        Log.d("Selected", arrData.get(item) + "");

                    }

4). 就这些:)


1
onClick() 方法中,你可以像这样做。
final AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        builder.setTitle(R.string.edit_set_waiting_period)
                .setItems(R.array.str_set_waiting_period, new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) {
                        // The 'which' argument contains the index position
                        // of the selected item
                        L.e("selectedItmes", which + "");

                        ListView lw = ((AlertDialog) dialog).getListView();
                        Object checkedItem = lw.getAdapter().getItem(which);
                        L.e("checkedItem", checkedItem.toString() + "");

                    }
                });

        builder.show();

关于在 setPositiveButton 上处理监听器的问题。 - Faisal Shaikh

0

在onClick方法中已经给出了所选元素的位置。因此,我们可以直接访问数组并获取所选项目,而无需任何麻烦。 在这种情况下:seq [which] 将是所选项目。


-8
EditText et = (EditText)findViewById(R.id.editText9);

int a = Integer.valueOf(item);

et.setText(items[a]);

3
你能详细说明一下吗?没有解释的代码并不是很有帮助。 - Michael Myers
1
我看不出这与任何相关的事情有什么关系。 - Matt Briançon

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