Получите NavController из контекста фрагмента, чтобы запустить SimpleDialog с прослушивателем обратного вызова - PullRequest
0 голосов
/ 20 июня 2020

У меня есть приложение с одним действием и множеством фрагментов. Структура Basi c используется по умолчанию и создается Android Studio с NavHostFragment. Так как рекомендуется использовать DialogFragment для диалогов, я создал простой диалог и добавил его в файл xml навигации стандартным способом

<dialog
    android:id="@+id/simple_dialog"
    android:name="com.lumisdinos.tabletransform.ui.dialog.SimpleDialog"
    android:label="SimpleDialog" >
</dialog>

Файл SimpleDialog

class SimpleDialog : DialogFragment() {

internal lateinit var listener: SimpleDialogListener


override fun onAttach(context: Context) {
    super.onAttach(context)
    try {
        listener = context as SimpleDialogListener
    } catch (e: ClassCastException) {
        // My activity doesn't implement the interface and throw this exception
        throw ClassCastException(
            (context.toString() +
                    " must implement SimpleDialogListener")
        )
    }
}

interface SimpleDialogListener {
    fun onPositiveClick()
    fun onNegativeClick()
    fun onNeutralClick()
}
...

, который я собирался запустить из таких фрагментов

val bundle = Bundle()
bundle.putString...
val navController = requireActivity().findNavController(R.id.nav_host_fragment)
navController.navigate(R.id.simple_dialog, bundle)

Слушатель реализован во фрагменте, из которого запускается диалог

open class FileFragment : DaggerFragment(), SimpleDialog.SimpleDialogListener {
override fun onPositiveClick() {}
override fun onNegativeClick(){}
override fun onNeutralClick(){}
...

Итак, здесь я получаю ClassCastException, потому что получаю

val navController = requireActivity()...

с помощью активности, а не фрагмента, и когда я внедряю слушателя в активность, все работает нормально.

Мой вопрос: как получить navController из фрагмента, используя структуру выше?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...