对我来说,更好的选择是使用android
data binding
.
viewModel
直接进入你的视野。
将简单的逻辑映射到您的视图中并不是一个缺点。在web开发中,这就是我们在模板中使用React或VueJs所做的。最重要的是保持简单。
从这个角度来看,当你想改变一些事情时,你知道你的
display logic
每次在你的
view
如果您的显示逻辑将更加复杂,您可以创建一个
Binding Adapter
.
class MyViewModel() : ViewModel() {
// prevent changing the value of the greeting var outside the viewModel
private val _greeting = MutableLiveData()
// we can access greeting value from here
val greeting: LiveData
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)
}
}
}
你的观点
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
name="viewModel"
type="your.package.MyViewModel" />
android:layout_width="match_parent"
android:layout_height="wrap_content">
android:id="@+id/textView"
android:dispGreeting="@{viewModel.greeting}" />
androidx.constraintlayout.widget.ConstraintLayout>