私はGoogleI/O2018で提示されたAndroidナビゲーションを使用していますが、ビューにバインドするか、NavHost
を使用してフラグメントから取得することで使用できるようです。しかし、必要なものいくつかの条件に応じて、最初のフラグメントからViewModelから別の特定のビューに移動することです。ViewModel
の場合、AndroidViewModel
を拡張しますが、次に行う方法がわかりません。getApplication
をフラグメント/アクティビティにキャストできず、NavHostFragment
を使用できません。また、onClickListener
にはstartFragment
が1つしかないため、ナビゲーションをImageView
にバインドすることはできません。ViewModel
からナビゲートするにはどうすればよいですか?
class CaptionViewModel(app: Application) : AndroidViewModel(app) {
private val dealerProfile = DealerProfile(getApplication())
val TAG = "REGDEB"
fun start(){
if(dealerProfile.getOperatorId().isEmpty()){
if(dealerProfile.isFirstTimeLaunch()){
Log.d(TAG, "First Time Launch")
showTour()
}else{
showCodeFragment()
Log.d(TAG, "Show Code Fragment")
}
}
}
private fun showCodeFragment(){
//??
}
private fun showTour(){
//??
}
}
私の断片
class CaptionFragment : Fragment() {
private lateinit var viewModel: CaptionViewModel
private val navController by lazy { NavHostFragment.findNavController(this) }
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
viewModel = ViewModelProviders.of(this).get(CaptionViewModel::class.Java)
return inflater.inflate(R.layout.fragment_caption, container, false)
}
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
viewModel.start()
}
}
ViewModelでナビゲーションのロジックを維持したい
ViewModelからナビゲートするにはどうすればよいですか?
答えはしないでください。 ViewModelは、UI関連のデータを保存および管理するように設計されています。
新しい回答
以前の回答で、ViewModelからナビゲートするべきではないと言いました。その理由は、ナビゲートするには、ViewModelにアクティビティ/フラグメントへの参照が必要であるためです。良い考えです。
しかし、Googleが推奨するアプリのアーキテクチャでは、モデルからUIを駆動する必要があると記載されています。そして、私が考えた後、これはどういう意味ですか?
そこで、「Android-architecture」のサンプルを確認したところ、Googleがどのようにそれを行ったかという興味深い方法を見つけました。
ここをチェックしてください: todo-mvvm-databinding
結局のところ、彼らは確かにモデルからUIを駆動する。しかし、どのように?