Для меня лучше выбрать android привязку данных .
Благодаря привязке данных ваше представление (. xml) имеет переменные. Таким образом, вы можете передать viewModel
прямо в ваше представление.
Нет ничего плохого в том, чтобы отобразить простые логи c в ваше представление. В веб-разработке это то, что мы делаем с React или VueJs в шаблоне. Самое главное - сохранить простоту.
С этой точки зрения, когда вы хотите что-то изменить, вы знаете, что ваш display logic
каждый раз находится в вашем view
.
Если ваша логика отображения c будет более сложной, вы можете создать Binding Adapter .
Вот пример:
class MyViewModel() : ViewModel() {
// prevent changing the value of the greeting var outside the viewModel
private val _greeting = MutableLiveData<GreetingType>()
// we can access greeting value from here
val greeting: LiveData<GreetingType>
get() = _greeting
fun setGreeting(g: GreetingType) {
if (_greeting.value != g) {
_greeting.value = g
}
}
}
Ваш фрагмент:
class MyFragment() : Fragment() {
private lateinit var viewModel: MyViewModel
private lateinit var binding: MyFragmentBinding
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// init your viewModel here
// [...]
binding = MyFragmentBinding.inflate(inflater, container, false)
binding.lifecycleOwner = viewLifecycleOwner
binding.viewModel = viewModel
return binding.root
}
}
Ваш объект привязки данных:
object MyFirstDatabinding {
@JvmStatic
@BindingAdapter("android:dispGreeting")
fun displayGreeting(txtView: TextView, greeting: GreetingType?) {
greeting?.let { g ->
val sentence = when(g) {
GREETING_FIRST_TIME -> view.context.getString(R.string.greeting_first_time)
WELCOME_BACK -> view.context.getString(R.string.welcome_back)
GOODBYE -> view.context.getString(R.string.goodbye)
}
txtView.setText(sentence)
}
}
}
Ваш взгляд
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<data>
<variable
name="viewModel"
type="your.package.MyViewModel" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/textView"
android:dispGreeting="@{viewModel.greeting}" />
</ androidx.constraintlayout.widget.ConstraintLayout>
</layout>