android - 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
?
提前致谢!
解决方案
我在这里遇到的问题是,不可能从调用片段调用 setMyAction 并调用 action(),因为在对话框中,视图为空,就像我尝试使用 dialog() 获取它一样。
您现在遇到的问题show()
是异步的。该对话框将在一段时间后创建,而不是在时间show()
返回时创建。
您尚未遇到但将会遇到的问题是,在配置更改时,您的活动及其片段将默认重新创建,您OnClickListener
将丢失。
与其推送事件处理程序,不如DialogFragment
公开结果(例如,通过共享ViewModel
)。
这里的第二个问题是:为什么永远不会调用 onCreateView,就像 onViewCreated 一样?
你超越了onCreateDialog()
。您不能同时使用onCreateDialog()
和onCreateView()
/ onViewCreated()
。选择一个并使用它。
推荐阅读
- python - 用 Python 控制 ESP32 凸轮的问题
- apache-spark - pyspark pandas udf - py4j.Py4JException:方法 __getstate__([]) 不存在
- r - dplyr::recode() 在选定的变量上
- html - 失去对应用程序中许多元素(如过滤器)的关注
- python - 文件重命名添加后缀
- r - R CMD 构建临时目录位置
- javascript - mat-select 日期(日-月-年)选择?
- ruby-on-rails - 如何将字符串对象转换为 ruby on rails 中的数组?
- c# - 如何在 Newtonsoft Json C# 中反序列化数组数组?
- java-8 - 如何使用 lambdas 表达式从嵌套 Maps 中提取值?