首页 > 解决方案 > Android DialogFragment getDialog() 和 getView() 返回 null

问题描述

我有一个 DialogFragment 需要从片段中显示。这是我的 DialogFragment:

class MyDialogFragment : DialogFragment() {
    companion object {
        @JvmStatic
        internal fun newInstance(): MyDialogFragment = MyDialogFragment()
    }

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? =
        inflater.inflate(R.layout.my_dialog_fragment container, false)

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        view.findViewById<MaterialButton>(R.id.cancel_button)?.setOnClickListener { dismiss() }
    }

    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
        val builder = AlertDialog.Builder(requireActivity())
        val dialogView = requireActivity().layoutInflater.inflate(R.layout.my_dialog_fragment, null)
        builder.setView(dialogView)

        dialogView.findViewById<Button>(R.id.cancel_button).setOnClickListener { dismiss() }

        return builder.create()
    }

    fun setMyAction(action: () -> Unit) {
        view?.findViewById<MaterialButton>(R.id.proceed_button)?.setOnClickListener { action() }
    }
}

我从片段中调用它的方式如下:

btnSubmit.setOnClickListener(view -> {
            MyDialogFragment myDialogFragment = new MyDialogFragment();
            myDialogFragment.show(getChildFragmentManager(), MyDialogFragment.class.getSimpleName());
            myDialogFragment.setMyAction(this::action);
        });

我在这里遇到的问题是,无法setMyAction从调用片段调用并调用action(),因为在对话框中,view就像null我尝试使用dialog(). 这里的第二个问题是:为什么onCreateView从未调用过,就像onViewCreated

提前致谢!

标签: androidkotlinandroid-dialogfragment

解决方案


我在这里遇到的问题是,不可能从调用片段调用 setMyAction 并调用 action(),因为在对话框中,视图为空,就像我尝试使用 dialog() 获取它一样。

您现在遇到的问题show()是异步的。该对话框将在一段时间后创建,而不是在时间show()返回时创建。

您尚未遇到但将会遇到的问题是,在配置更改时,您的活动及其片段将默认重新创建,您OnClickListener将丢失。

与其推送事件处理程序,不如DialogFragment公开结果(例如,通过共享ViewModel)。

这里的第二个问题是:为什么永远不会调用 onCreateView,就像 onViewCreated 一样?

你超越了onCreateDialog()。您不能同时使用onCreateDialog()onCreateView()/ onViewCreated()。选择一个并使用它。


推荐阅读