Я опробую новые компоненты архитектуры Android и столкнулся с препятствием при попытке использовать модель MVVM для настраиваемого представления.
По сути, я создал собственное представление для инкапсуляции общего пользовательского интерфейса и соответствующей логики для использования в приложении. Я могу настроить 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 из Activity`
активность
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)
}
}
Я просто неправильно использую шаблоны и компоненты? Я чувствую, что должен быть более чистый способ составления сложных представлений из нескольких вложенных представлений без привязки их к Activity / Fragment