web-dev-qa-db-ja.com

ViewModel(MVVM)でUIにバインドせずにAndroidナビゲーションを使用する方法は?

私は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でナビゲーションのロジックを維持したい

8

ViewModelからナビゲートするにはどうすればよいですか?

答えはしないでください。 ViewModelは、UI関連のデータを保存および管理するように設計されています。

新しい回答

以前の回答で、ViewModelからナビゲートするべきではないと言いました。その理由は、ナビゲートするには、ViewModelにアクティビティ/フラグメントへの参照が必要であるためです。良い考えです。

しかし、Googleが推奨するアプリのアーキテクチャでは、モデルからUIを駆動する必要があると記載されています。そして、私が考えた後、これはどういう意味ですか?

そこで、「Android-architecture」のサンプルを確認したところ、Googleがどのようにそれを行ったかという興味深い方法を見つけました。

ここをチェックしてください: todo-mvvm-databinding

結局のところ、彼らは確かにモデルからUIを駆動する。しかし、どのように?

  1. 彼らはインターフェースを作成しました TasksNavigator 基本的には単なるナビゲーションインターフェースです。
  2. 次に、 TasksViewModel で、TaskNavigatorへのこの参照があるため、アクティビティ/フラグメントを直接参照せずにUIを駆動できます。
  3. 最後に、TasksActivityはTasksNavigatorを実装して、各ナビゲーションアクションの詳細を提供し、ナビゲーターをTasksViewModelに設定しました。
7
Yosi Pramajaya