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)
}
}