You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在DialogFragment类与Activity之间传递ArrayList<String>?

在自定义DialogFragment与Activity之间传递ArrayList的解决方案

你已经找对了核心思路——用接口回调来实现DialogFragment和宿主Activity的通信,这也是Android官方推荐的Fragment与Activity交互的标准方式,比Intent更适合这种场景。我来帮你把整个流程理清楚,顺便修正代码里的小细节:

第一步:优化你的DialogFragment代码

先把代码里的小问题调整一下:

  • 接口名遵循Java命名规范,改成OnMultiChoiceListener(首字母大写)
  • DialogFragment本身已经实现了Serializable接口,不需要额外声明
  • 在onAttach里增加类型判断,让异常处理更严谨

调整后的DialogFragment代码:

public class MultipleChoiceDialogFragment extends DialogFragment {
    // 修正接口命名
    public interface OnMultiChoiceListener{
        void onPositiveButtonClicked(String[] list , ArrayList<String> selectedItemList);
        void onNegativeButtonClicked() ;
    }

    private OnMultiChoiceListener mListener;

    @Override
    public void onAttach(@NonNull Context context) {
        super.onAttach(context);
        // 增加类型判断,避免强制转换失败
        if (context instanceof OnMultiChoiceListener) {
            mListener = (OnMultiChoiceListener) context;
        } else {
            throw new ClassCastException(getActivity().toString() + " 必须实现OnMultiChoiceListener接口");
        }
    }

    @NonNull
    @Override
    public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
        final ArrayList<String> selectedItemList = new ArrayList<>();
        final String[] list = requireActivity().getResources().getStringArray(R.array.selectableRole);
        
        AlertDialog.Builder mbuilder = new AlertDialog.Builder(requireActivity());
        mbuilder.setTitle("选择角色")
                .setMultiChoiceItems(list, null, new DialogInterface.OnMultiChoiceClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int i, boolean b) {
                        if (b){
                            selectedItemList.add(list[i]);
                        }else {
                            selectedItemList.remove(list[i]);
                        }
                    }
                })
                .setPositiveButton("确定", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int i) {
                        // 点击确定时,通过接口把选中列表传递给Activity
                        if (mListener != null) {
                            mListener.onPositiveButtonClicked(list, selectedItemList);
                        }
                    }
                })
                .setNegativeButton("取消", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        if (mListener != null) {
                            mListener.onNegativeButtonClicked();
                        }
                    }
                });
        return mbuilder.create();
    }
}

第二步:在目标Activity中实现接口,接收选中列表

只需要让你的Activity实现OnMultiChoiceListener接口,重写对应的方法,就能拿到最终的选中列表了:

public class TargetActivity extends AppCompatActivity implements MultipleChoiceDialogFragment.OnMultiChoiceListener {

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

        // 触发显示DialogFragment的逻辑,比如绑定按钮点击事件
        findViewById(R.id.btn_show_dialog).setOnClickListener(v -> {
            MultipleChoiceDialogFragment dialog = new MultipleChoiceDialogFragment();
            dialog.show(getSupportFragmentManager(), "MultiChoiceDialogTag");
        });
    }

    // 这里就是接收选中列表的核心方法
    @Override
    public void onPositiveButtonClicked(String[] list, ArrayList<String> selectedItemList) {
        // 拿到选中列表后,你可以做任何你需要的操作:打印、展示到UI、存储等等
        StringBuilder sb = new StringBuilder("你选中了:");
        for (String item : selectedItemList) {
            sb.append(item).append(" ");
        }
        Toast.makeText(this, sb.toString(), Toast.LENGTH_LONG).show();
    }

    @Override
    public void onNegativeButtonClicked() {
        // 处理取消按钮的逻辑,比如提示用户取消了选择
        Toast.makeText(this, "已取消选择", Toast.LENGTH_SHORT).show();
    }
}

为什么不用Intent?

Intent主要用于跨组件通信(比如Activity之间、Activity和Service之间),而DialogFragment是依附于Activity存在的,属于同一个组件内部的交互,用接口回调更直接、高效,也更符合Android的组件设计思想。

内容的提问来源于stack exchange,提问作者p.k

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:36:03