【问题标题】:Trouble showing datepicker dialog fragment using Navigation component使用导航组件显示日期选择器对话框片段时出现问题
【发布时间】:2019-05-19 10:03:53
【问题描述】:

我正在尝试使用导航组件来显示日期选择器对话框片段。我收到以下错误:

android.view.WindowManager$BadTokenException: 无法添加窗口--token null 无效;您的活动正在进行吗?

这是我的 DatePicker 类

class DatePickerFragment : DialogFragment(), DatePickerDialog.OnDateSetListener {

var datePickerListener: DatePickerFragmentListener? = null

override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
    // Use the current date as the default date in the picker
    val c = Calendar.getInstance()
    val year = c.get(Calendar.YEAR)
    val month = c.get(Calendar.MONTH)
    val day = c.get(Calendar.DAY_OF_MONTH)

    // Create a new instance of DatePickerDialog and return it
    return DatePickerDialog(VitrixDataCollectionApp.context, this, year, month, day)
}

interface DatePickerFragmentListener {
    fun onDateSet(view: DatePicker, year: Int, month: Int, day: Int)
}

override fun onDateSet(view: DatePicker, year: Int, month: Int, day: Int) {
    datePickerListener?.onDateSet(view,year, month, day)
}
}

我想在 TextInputField 具有焦点时显示日期选择器。这是我导航到 DatePicker 的代码

private fun showDatePicker(hasFocus: Boolean, view: View) {
    Log.i(FRAGMENT_NAME, "Has focus $hasFocus")
    if (hasFocus) {
        Navigation.findNavController(view).navigate(R.id.action_createPatientDetailsFragment_to_datePickerFragment)
    }
}

这是我的导航图 xml 的相关部分

<fragment android:id="@+id/createPatientDetailsFragment"
          android:name="com.datacollection.ui.patients.create_patient.patient_details.CreatePatientDetailsFragment"
          android:label="create_patient_details_fragment"
          tools:layout="@layout/create_patient_details_fragment">
    <action android:id="@+id/action_createPatientDetailsFragment_to_datePickerFragment"
            app:destination="@id/datePickerFragment"/>
</fragment>
<dialog
        android:id="@+id/datePickerFragment"
        android:name="com.datacollection.ui.DatePickerFragment"/>

我正在使用导航控制器版本:2.1.0-alpha04

这是我的问题:

  1. 如何让对话框片段显示?
  2. 如何找到我的 DatePicker 片段的 id,我猜它是 R.id.datePickerFragment

如果您需要更多信息或需要查看我的更多代码,请告诉我。

【问题讨论】:

  • 确保从androidx.fragment.app.DialogFragment扩展DialogFragment。
  • 是的,检查过。我正在使用 androidx 的东西。
  • 在我的情况下工作正常。
  • 你能发布你的代码作为答案吗,我想和我的比较一下,以防我错过了什么。
  • 问题在您的 onCreateDialog 中。在我的代码中传递应用程序上下文后,我也得到了异常。

标签: android kotlin android-dialogfragment android-architecture-navigation


【解决方案1】:

1.如何让对话框片段显示?

异常表示您的活动正在运行吗? DialogFragment 需要活动/片段的上下文而不是应用程序。更新您的DatePickerFragment 的以下行

return DatePickerDialog(VitrixDataCollectionApp.context, this, year, month, day)

return DatePickerDialog(context, this, year, month, day)

在 kotlin 中 context 是您正在扩展的 framgent 的属性。对于java,您可以使用getContext()

【讨论】:

    【解决方案2】:

    这样使用:

    <dialog-fragment
        android:id="@+id/my_dialog"
        android:name="com.example.ui.MyDialogFragment"
        tools:layout="@layout/my_dialog" />
    

    代替:

    <dialog
        android:id="@+id/datePickerFragment"
        android:name="com.datacollection.ui.DatePickerFragment"/>
    

    发布:

    findNavController().navigate(R.id.my_dialog)
    

    Navigation Architecture Component你不能直接使用dialog

    【讨论】:

    • 将标签从“dialog”更改为“dialog-fragment”会给我一个“此处不允许元素对话框片段”警告,并使用“找不到名称为“对话框的导航器”使我的应用程序崩溃-fragment”。您必须为每种导航类型调用 NavController.addNavigator()。”启动时出错。
    • 很抱歉投了反对票,但根据此处找到的开发人员文档:developer.android.com/guide/navigation/… -> “如果您有现有的 DialogFragment,您可以使用 元素将对话框添加到导航图中,如下例所示:"
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多