我有一个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()
,因为在对话框中,view
是null
,就像我试图用dialog()
获取它一样。这里的第二个问题是:为什么onCreateView
永远不会被调用,就像onViewCreated
一样?
先谢谢你了!
2条答案
按热度按时间wlp8pajw1#
这里的问题是,不可能从调用片段调用setMyAction并调用action(),因为在dialog中,view是null,就像我试图用dialog()获取它一样。
您现在遇到的问题是
show()
是异步的。对话框将在稍后创建,而不是在show()
返回之前创建。您现在还没有遇到但将来会遇到的问题是,在配置更改时,您的Activity及其片段将在默认情况下重新创建,并且您的
OnClickListener
将丢失。不要将事件处理程序推入,而是让
DialogFragment
暴露结果(例如:例如经由共享ViewModel
)。这里的第二个问题是:为什么onCreateView永远不会被调用,就像onViewCreated一样?
你覆盖了
onCreateDialog()
。不能同时使用onCreateDialog()
和onCreateView()
/onViewCreated()
。挑一个,用它。xzv2uavs2#
我阶段半类似的问题,当我只是检查对话框是打开或不通过日志和其返回空值。所以我只是在下面加上一行,它的工作很好。
如果你在片段中显示对话框,那么使用类似
如果在Activity中显示对话框,则不需要使用requireActivity()。