如何获取带复选框的AlertDialog布局以操作内部CheckBox控件
解决方法
你使用setMultiChoiceItems创建的AlertDialog默认内置了列表控件,不需要手动查找根布局,按照以下步骤操作即可:
- 必须在调用
dialog.show()之后再获取布局,此时对话框的视图已经完成渲染 - 直接调用
dialog.getListView()即可获取承载多选项的ListView容器
方案1:直接修改视图(仅适合少量选项)
如果你的选项数量不超过一屏,没有列表复用问题,可以直接遍历子View修改:
public void dialog_box () { AlertDialog.Builder builder = new AlertDialog.Builder (this); builder.setTitle ("Choose some animals"); // add a checkbox list String [] animals = {"horse", "cow", "camel", "sheep", "goat"}; boolean [] checkedItems = {true, false, false, true, false}; builder.setMultiChoiceItems (animals, checkedItems, new DialogInterface.OnMultiChoiceClickListener () { @Override public void onClick (DialogInterface dialog, int which, boolean isChecked) { // 同步更新数组状态 checkedItems[which] = isChecked; } }); // add OK and Cancel buttons builder.setPositiveButton ("OK", new DialogInterface.OnClickListener () { @Override public void onClick (DialogInterface dialog, int which) { // user clicked OK } }); builder.setNegativeButton ("Cancel", null); // create and show the alert dialog AlertDialog dialog = builder.create (); dialog.show (); // 批量修改复选框状态代码 ListView listView = dialog.getListView(); for (int i = 0; i < listView.getChildCount(); i++) { View v = listView.getChildAt(i); if (v instanceof CheckBox) { ((CheckBox) v).setChecked(true); checkedItems[i] = true; } } }
方案2:修改数据源刷新(推荐,适配任意数量选项)
因为ListView有复用机制,直接修改子View在滑动时会出现状态丢失,更稳妥的方式是直接修改数据源后刷新列表:
// 批量将所有选项设为选中 Arrays.fill(checkedItems, true); // 刷新列表同步UI状态 dialog.getListView().invalidateViews();
自定义布局场景的处理
如果你后续使用自定义布局的AlertDialog,通过setView方法设置布局时,可以提前持有布局引用再操作:
// 提前加载自定义布局,持有引用 View customDialogView = LayoutInflater.from(this).inflate(R.layout.dialog_custom, null); builder.setView(customDialogView); // 直接通过布局引用查找对应容器 LinearLayout ll = customDialogView.findViewById(R.id.checkbox_container); // 后续就可以用你参考的遍历代码操作ll内的子控件
内容的提问来源于stack exchange,提问作者nilrem
相关产品推荐
相关产品推荐

