У меня есть приложение с одним действием и множеством фрагментов. Структура 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 из фрагмента, используя структуру выше?