背景
Share data between fragments
をkoin + DialogFragmentに適用したらこんな感じ?
実装
MainActivity.kt
class MainActivity : AppCompatActivity() {
private val model by viewModel<MainViewModel>()
private val sharedViewModel by viewModel<MainDialogFragment.SharedViewModel>() // 2
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val binding = DataBindingUtil.setContentView<ActivityMainBinding>(this, R.layout.activity_main)
binding.button.setOnClickListener {
MainDialogFragment().show(this.supportFragmentManager, MainDialogFragment.TAG)
}
this.sharedViewModel.selected.observe(this, Observer { selected -> // 4
this.model.string.postValue(selected)
})
}
}
MainDialogFragment.kt
class MainDialogFragment : DialogFragment() {
private val sharedViewModel by sharedViewModel<SharedViewModel>() // 3
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
val binding = DataBindingUtil.inflate<FragmentMainDialogBinding>(inflater, R.layout.fragment_main_dialog, container, false)
binding.buttonDone.setOnClickListener {
this.sharedViewModel.selected.postValue(binding.editText.text.toString()) // 5
this.dismiss()
}
return binding.root
}
class SharedViewModel : ViewModel() { // 1
val selected = MutableLiveData<String>()
}
}
- SharedViewModelはDialogFragmentの持ち物とする
- Activity(DialogFragmentを表示する)側:ViewModelをinject
- DialogFragment側:
sharedViewModel
でActivityと共有されたViewModelをinject - Activity側:DialogFragmentでの変更を待ち受ける
- DialogFragment側:postValueで変更を伝える