Edited at

Navigationを使ってDialogFragmentを表示する

navigation#2.1.0-alpha03 から DialogFragmentがサポートされました。

https://developer.android.com/jetpack/androidx/releases/navigation#2.1.0-alpha03

<dialog>としてnavigationのxmlには定義する


navigation.xml

<?xml version="1.0" encoding="utf-8"?>

<navigation xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" android:id="@+id/top"
app:startDestination="@id/TopFragment">
略...
<dialog
android:id="@+id/datePickerDialogFragment"
android:name="com.example.DatePickerDialogFragment"
android:label="DatePickerDialogFragment" >
</dialog>
</navigation>

ダイアログを表示したい時は通常のnavigationと同様

val action = TopFragmentDirections.actionTopFragmentToDatePickerDialogFragment()

findNavController().navigate(action)

ダイアログの結果の反映や値の受け渡しにはViewModelを使えば良い。


DatePickerDialogFragment.kt

class DatePickerDialogFragment : DialogFragment(), AnkoLogger {

lateinit var viewModel: TopViewModel
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
return DatePickerDialog(
requireContext(),
DatePickerDialog.OnDateSetListener { view, year, month, dayOfMonth ->
viewModel.onDateSet(year,month,dayOfMonth)
},
viewModel.year,
viewModel.month,
viewModel.dayOfMonth)
}

override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
viewModel = ViewModelProviders.of(this, ViewModelFactory).get(TopViewModel::class.java)
}
}