web-dev-qa-db-ja.com

LifecycleOwnerなしのカスタムビューでのLiveDataオブザーバーの設定

新しいAndroidアーキテクチャコンポーネントを試してみましたが、カスタムビューにMVVMモデルを使用しようとすると、ロードブロックに遭遇しました。

基本的に、共通のUIをカプセル化するカスタムビューを作成しました。これは、アプリ全体で使用するそれぞれのロジックです。カスタムモデルでViewModelを設定できますが、observeForever()を使用するか、以下のようにカスタムビューでLifecycleOwnerを手動で設定する必要がありますが、どちらも正しくないようです。

オプション1)observeForever()を使用する

アクティビティ

class MyActivity : AppCompatActivity() {

    lateinit var myCustomView : CustomView

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        myCustomView = findViewById(R.id.custom_view)
        myCustomView.onAttach()
    }

    override fun onStop() {
        myCustomView.onDetach()
    }
}

カスタムビュー

class (context: Context, attrs: AttributeSet) : RelativeLayout(context,attrs){

    private val viewModel = CustomViewModel()

    fun onAttach() {
        viewModel.state.observeForever{ myObserver }
    }

    fun onDetach() {
        viewModel.state.removeObserver{ myObserver }
    }
}

オプション2)アクティビティからのlifecycleOwnerの設定 `

アクティビティ

class MyActivity : AppCompatActivity() {

    lateinit var myCustomView : CustomView

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        myCustomView = findViewById(R.id.custom_view)
        myCustomView.setLifeCycleOwner(this)
    }
}

カスタムビュー

class (context: Context, attrs: AttributeSet) : RelativeLayout(context,attrs){

    private val viewModel = CustomViewModel()

    fun setLifecycleOwner(lifecycleOwner: LifecycleOwner) {
        viewModel.state.observe(lifecycleOwner)
    }
}

パターンとコンポーネントを誤用しているだけですか?アクティビティ/フラグメントに関連付けることなく、複数のサブビューから複雑なビューを作成するためのより明確な方法があるはずだと思います

12
kcrimi

1オプション-意図的に、まだonAttach\onDetachを呼び出すなどの手作業を行う必要があります。アーキテクチャコンポーネントの主な目的は、これを防ぐことです。

2オプション-私の意見ではより良いですが、ViewModelViewの周りにロジックをバインドするのは少し間違っていると思います。 ViewModelとLifecycleOwnerCustomViewに渡さなくても、Activity/Fragment内で同じロジックを実行できると思います。このためには、単一のメソッドupdateDataで十分です。

したがって、この特定のケースでは、アーキテクチャコンポーネントの過剰使用と言えます。

4
Mike