实现 Android 可以多选的 Dialog

1. 整体流程

为了实现 Android 可以多选的 Dialog,我们可以按照以下步骤进行:

步骤 动作
1 创建一个自定义的 DialogFragment
2 在 DialogFragment 中创建一个多选列表
3 在 Activity 中显示这个 DialogFragment
4 处理用户选择的结果

下面我们将逐步介绍每一步需要做的事情。

2. 创建自定义的 DialogFragment

首先,我们需要创建一个自定义的 DialogFragment,用于显示多选列表。在这个 DialogFragment 中,我们将使用 AlertDialog.Builder 创建一个多选列表。

首先,在项目的 res/layout 目录下创建一个新的布局文件,命名为 dialog_multiselect.xml。在该布局文件中,我们可以自定义 Dialog 的样式,例如标题、按钮等。以下是一个简单的示例:

<LinearLayout xmlns:android="
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <TextView
        android:id="@+id/dialog_title"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Select Items"
        android:textSize="18sp"
        android:textStyle="bold"
        android:padding="16dp" />

    <ListView
        android:id="@+id/dialog_list"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:divider="@android:color/darker_gray"
        android:dividerHeight="1dp" />

    <Button
        android:id="@+id/dialog_button"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="OK"
        android:padding="16dp" />

</LinearLayout>

接下来,创建一个新的 Java 类,命名为 MultiSelectDialog。让这个类继承自 DialogFragment,并实现 DialogInterface.OnMultiChoiceClickListener 接口,用于处理用户选择的结果。

public class MultiSelectDialog extends DialogFragment implements DialogInterface.OnMultiChoiceClickListener {

    private String[] items;
    private boolean[] checkedItems;
    private OnMultiSelectListener listener;

    public MultiSelectDialog() {
        // 空的构造函数,必须要有
    }

    public void setItems(String[] items) {
        this.items = items;
        this.checkedItems = new boolean[items.length];
    }

    public void setListener(OnMultiSelectListener listener) {
        this.listener = listener;
    }

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        builder.setTitle("Select Items")
                .setMultiChoiceItems(items, checkedItems, this)
                .setPositiveButton("OK", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        if (listener != null) {
                            listener.onMultiSelect(getSelectedItems());
                        }
                    }
                })
                .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        dismiss();
                    }
                });

        return builder.create();
    }

    @Override
    public void onClick(DialogInterface dialog, int which, boolean isChecked) {
        checkedItems[which] = isChecked;
    }

    private List<String> getSelectedItems() {
        List<String> selectedItems = new ArrayList<>();
        for (int i = 0; i < checkedItems.length; i++) {
            if (checkedItems[i]) {
                selectedItems.add(items[i]);
            }
        }
        return selectedItems;
    }

    public interface OnMultiSelectListener {
        void onMultiSelect(List<String> selectedItems);
    }
}

3. 显示 DialogFragment

接下来,我们需要在 Activity 中显示这个自定义的 DialogFragment。在 Activity 中,我们可以通过调用 DialogFragment 的 show 方法来显示它。

首先,在 Activity 的布局文件中添加一个按钮,用于触发显示 DialogFragment。

<Button
    android:id="@+id/show_dialog_button"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Show Dialog" />

然后,在 Activity 的 Java 代码中,我们需要找到这个按钮,并为它设置一个点击事件。

public class MainActivity extends AppCompatActivity {

    private Button showDialogButton;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        showDialogButton = findViewById(R.id.show_dialog_button);
        showDialogButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                showMultiSelectDialog();
            }
        });
    }

    private void showMultiSelectDialog() {
        MultiSelectDialog dialog