使用导航组件无法显示日期选择器对话框片段

时间:2019-05-19 10:03:53

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

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

  

android.view.WindowManager $ BadTokenException:无法添加窗口-令牌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"/>

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

这是我的问题:

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

让我知道您是否需要更多信息或需要查看我的代码。

2 个答案:

答案 0 :(得分:0)

像这样使用:

<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

答案 1 :(得分:0)

1。如何显示对话框片段?

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

的下一行
return DatePickerDialog(VitrixDataCollectionApp.context, this, year, month, day)

使用

return DatePickerDialog(context, this, year, month, day)
Kotlin context中的

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