2020年にもなっていまだにDialogFragmentのコールバック最適解がないのでGoogleは早くJetPackに作ってほしい
class MainActivity : AppCompatActivity() {
private val viewModel: DialogViewModel<MainDialogResult> by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
if (savedInstanceState == null) {
SampleDialogFragment().show(supportFragmentManager, "sample")
}
viewModel.result.observe(this) {
when (it) {
is MainDialogResult.Ok -> {
Log.i("result", it.message)
}
is MainDialogResult.Cancel -> {
Log.i("result", "cancel")
}
}
}
}
}
///////////////////// CallBack
sealed class MainDialogResult {
data class Ok(val message: String) : MainDialogResult()
object Cancel : MainDialogResult()
}
class DialogViewModel<T> : ViewModel() {
val result: MutableLiveData<T> = MutableLiveData()
}
///////////////////// DialogFragment
class SampleDialogFragment : DialogFragment() {
private val viewModel: DialogViewModel<MainDialogResult> by activityViewModels()
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
return AlertDialog.Builder(requireContext())
.setPositiveButton(android.R.string.ok) { _, _ ->
val message = "OK!"
viewModel.result.postValue(MainDialogResult.Ok(message))
}
.setNegativeButton(android.R.string.cancel) { _, _ ->
viewModel.result.postValue(MainDialogResult.Cancel)
}
.create()
}
}
これでActivity/Fragment共に画面回転のことも考慮してもちゃんと結果が受け取れるようになります。
しかしボイラープレートが多いですね...ほとんど再利用できる箇所がない