android - 使用导航组件显示日期选择器对话框 fragment 时出现问题

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

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

android.view.WindowManager$BadTokenException: Unable to add window -- token null is not valid; is your activity running?



这是我的 DatePicker 类(class)
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"/>

我正在使用导航 Controller 版本:2.1.0-alpha04

以下是我的问题:
  • 如何让对话框 fragment 显示?
  • 如何找到我的 DatePicker fragment 的 id,我猜它是 R.id.datePickerFragment

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

    最佳答案

    1.如何让对话框 fragment 显示?

    异常(exception)说 您的 Activity 正在运行吗?
    DialogFragment 需要 Activity/fragment 的上下文而不是应用程序。更新您的 DatePickerFragment 的以下行

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


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

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

    关于android - 使用导航组件显示日期选择器对话框 fragment 时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56206728/

    相关文章:

    android - 查尔斯在浏览器上工作,但不适用于应用程序 - Android

    Android - 如何更改 TabActivity 中的 Activity ?

    android - 无法在 Android 项目中的两个模块之间进行通信?

    java - Supplier<Sequence<String>> 不能迭代多次

    java - 将一个 int 乘以 30、31、32 - 这些真的被编译器优化了吗? (有效的java这么说)

    android - DialogFragment 参数和空指针异常

    android - 显示 DialogFragment 时调用 fragment 不会暂停

    Android ListView 斜体

    hibernate - 为什么带有@EmbeddedId的实体不能在对应的@Embeddable类中使用LocalDateTime?

    android - 隐藏以在 DialogFragment 中显示和隐藏键盘