kotlin - 导航控制器 AlertDialog 点击监听器
问题描述
我正在使用 Android 的导航组件,我想知道如何从带有点击侦听器的片段设置 AlertDialog。
我的片段
fun MyFragment : Fragment(), MyAlertDailog.MyAlertDialogListener {
...
override fun onDialogPostiveCLick(dialog: DialogFragment) {
Log.i(TAG, "Listener returns a postive click")
}
fun launchMyAlertDialog() {
// Here I would typically call setTargetFragment() and then show the dialog.
// but findnavcontroller doesn't have setTargetFragment()
findNavController.navigate(MyFragmentDirection.actionMyFragmentToMyAlertDialog())
}
}
我的警报对话框
class MyAlertDialog : DialogFragment() {
...
internal lateinit var listener: MyAlertDialogListener
interface MyAlertDialogListener{
fun onDialogPostiveCLick(dialog: DialogFragment)
}
override fun onCreateDialog(savdInstanceState: Bundle?): Dialog {
return activity?.let {
val builder = AlertDialog.Builder(it)
builder.setMessage("My Dialog message")
.setPositiveButton("Positive", DialogInterface.OnClickListener {
listener = targetFragment as MyAlertDialogListener
listener.onDialogPositiveClick(this)
}
...
}
}
}
这当前在 MyAlertDialog 中初始化侦听器时收到空点异常。
解决方案
要使用targetFragment
,您必须在评论时首先设置它,不幸的是,jetpack 导航不会为您执行此操作(因此出现空指针异常)。查看此线程以获取替代解决方案:https ://stackoverflow.com/a/50752558/12321475
我能给你的是另一种选择。如果用例就像在当前片段上方显示一个对话框一样简单,那么执行以下操作:
import androidx.appcompat.app.AlertDialog
...
class MyFragment : Fragment() {
...
fun onDialogPostiveCLick() {
Log.i(TAG, "Listener returns a postive click")
}
fun launchMyAlertDialog() {
AlertDialog.Builder(activity)
.setMessage("My Dialog message")
.setPositiveButton("Positive") { _, _ -> onDialogPostiveCLick() }
.setCancellable(false)
.create().show()
}
}
推荐阅读
- java - 为什么差值是负值?
- javascript - NWJS:找不到模块 ./lib/helpers
- entity-framework - 实体框架 - 扩展具有一对多关系的类
- android - 如何添加原生 android 项目以响应原生?
- gulp - Gulp 缩小,一些任务未完成
- python - OpenGL - 将场景渲染为墨卡托/圆柱
- javascript - 我有两个功能,当我运行程序时,似乎只有按钮点击计数器功能在运行。他们都单独工作
- php - 如何获取 PHP 上复选框的值?
- eclipse - 在eclipse中导入javadoc的简单方法
- c - 如何用 C 中的指针解决这个问题?