Ошибка при отображении фрагмента диалога DatePicker с использованием компонента Navigation - PullRequest
1 голос
/ 19 мая 2019

Я пытаюсь использовать компонент навигации, чтобы отобразить фрагмент диалога выбора даты. Я получаю следующую ошибку:

android.view.WindowManager $ BadTokenException: невозможно добавить окно - нулевой токен недействителен; ваша деятельность работает?

Это мой класс 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, я как-то догадался, что это R.id.datePickerFragment

Дайте мне знать, если вам нужна дополнительная информация или вам нужно больше посмотреть мой код.

Ответы [ 2 ]

0 голосов
/ 24 мая 2019

1. Как получить фрагмент диалога для показа?

Исключение говорит о том, что ваша деятельность запущена? DialogFragment нуждается в контексте действия / фрагмента вместо приложения. Обновите нижнюю строку вашего DatePickerFragment

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

С

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

в котлине context - это свойство framgent, которое вы расширяете. Для Java вы можете использовать getContext().

0 голосов
/ 23 мая 2019

Используйте вот так:

<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 напрямую.

...