kotlin Android DialogFragment getDialog()和getView()返回null

mjqavswn  于 2023-05-01  发布在  Kotlin
关注(0)|答案(2)|浏览(279)

我有一个DialogFragment,我需要从一个Fragment中显示它。这是我的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(),因为在对话框中,viewnull,就像我试图用dialog()获取它一样。这里的第二个问题是:为什么onCreateView永远不会被调用,就像onViewCreated一样?
先谢谢你了!

wlp8pajw

wlp8pajw1#

这里的问题是,不可能从调用片段调用setMyAction并调用action(),因为在dialog中,view是null,就像我试图用dialog()获取它一样。
您现在遇到的问题是show()是异步的。对话框将在稍后创建,而不是在show()返回之前创建。
您现在还没有遇到但将来会遇到的问题是,在配置更改时,您的Activity及其片段将在默认情况下重新创建,并且您的OnClickListener将丢失。
不要将事件处理程序推入,而是让DialogFragment暴露结果(例如:例如经由共享ViewModel)。
这里的第二个问题是:为什么onCreateView永远不会被调用,就像onViewCreated一样?
你覆盖了onCreateDialog()。不能同时使用onCreateDialog()onCreateView()/onViewCreated()。挑一个,用它。

xzv2uavs

xzv2uavs2#

我阶段半类似的问题,当我只是检查对话框是打开或不通过日志和其返回空值。所以我只是在下面加上一行,它的工作很好。
如果你在片段中显示对话框,那么使用类似

DialogFragment dialogFragment = new DialogFragment();  
dialogFragment.show(requireActivity().getSupportFragmentManager(),"Dialog");  
requireActivity().getSupportFragmentManager().executePendingTransactions();

如果在Activity中显示对话框,则不需要使用requireActivity()。

相关问题