是否可以强制用户在 AlertDialog setMultiChoiceItems() 中选择至少一个选项?

问题描述 投票:0回答:1

我有一个

DialogFragment
,向用户显示三个选项和一个肯定按钮。该对话框充当过滤器,因此用户可以检查所有选项(两个或一个),并基于此,我显示一些项目或其他项目。

目前,它可以工作,但用户也可以取消选中所有选项并点击“应用”按钮,使我的

Fragment
不显示任何项目。我想在发生这种情况之前向用户显示一条消息,警告他/她必须检查至少 1 个选项,因此,避免关闭对话框,直到用户关闭对话框或检查至少一个选项并点击接受。

这是我的代码:

public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
    AlertDialog.Builder builder = new AlertDialog.Builder(this.getActivity());
    builder.setTitle(this.getResources().getString(R.string.filter_title));
    builder.setMultiChoiceItems(this.choices, this.selection,
            new DialogInterface.OnMultiChoiceClickListener() {
                @Override
                public void onClick(DialogInterface dialogInterface, int i, boolean b) {
                    changeSelection(i, b);
                }
            });
    builder.setPositiveButton(R.string.filter_accept, 
            new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialogInterface, int i) {
            listener.onDialogPositiveClick(ListItemsFragment.this);
        }
    });
    return builder.create();
}

谢谢!

android dialog android-dialogfragment dialogfragment multichoiceitems
1个回答
0
投票

鉴于您共享的代码,我真的不知道函数

changeSelection(..)
在做什么,或者您如何处理来自多选侦听器的响应。

尽管如此,我认为在肯定按钮的单击侦听器回调中,您应该检查

this.selection
布尔数组中的任何值当前是否为
true
,并且只有在这种情况下才向前移动。
selector
数组应该在
MultiChoiceItems
侦听器上更新,这应该使您能够始终根据当前数据进行操作。

简而言之,我会尝试做类似的事情:

public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
    AlertDialog.Builder builder = new AlertDialog.Builder(this.getActivity());
    builder.setTitle(this.getResources().getString(R.string.filter_title));
    builder.setMultiChoiceItems(this.choices, this.selection,
            new DialogInterface.OnMultiChoiceClickListener() {
                @Override
                public void onClick(DialogInterface dialogInterface, int index, boolean isChecked) {
                    // Keep track of the selected items
                    selection[index] = isChecked;
                }
            });
    builder.setPositiveButton(R.string.filter_accept, 
            new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialogInterface, int i) {
            for (boolean isSelected : selection) {
                if (isSelected) {
                    // Found at least one selected option -- carry on
                    listener.onDialogPositiveClick(ListItemsFragment.this);
                } else {
                    // Unable to find not a single selected option
                    //TODO: Handle not having a single option selected
                }
            }
        }
    });
    return builder.create();
}

MultiChoiceItems 选择器不断跟踪最新的选择(您可能已经在内部执行此操作了

changeSelection(..)
),并且不要让肯定按钮单击前进,除非我们可以确认当前确实至少有一个项目已选择。

© www.soinside.com 2019 - 2024. All rights reserved.