我有一个
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();
}
谢谢!
鉴于您共享的代码,我真的不知道函数
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(..)
),并且不要让肯定按钮单击前进,除非我们可以确认当前确实至少有一个项目已选择。