【问题标题】:Bindings in MVVM not work for Android with ViewModelProvidersMVVM 中的绑定不适用于带有 ViewModelProviders 的 Android
【发布时间】:2018-04-13 04:27:59
【问题描述】:

绑定后,nameonClick 的绑定都不起作用。按钮没有文字,点击后没有任何反应。

是因为lateinit吗?我这样做是因为否则我必须让它为空才能让 Kotlin 开心。因为我必须在声明属性时对其进行初始化。我在这里缺少什么吗?

这是 xml 文件:

<?xml version="1.0" encoding="utf-8"?>

<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">

    <data>
        <variable
            name="authViewModel"
            type="nz.salect.handset.viewmodels.AuthViewModel" />
    </data>

    <android.support.constraint.ConstraintLayout
        ...
        tools:context="nz.salect.handset.view.AuthActivity">

        ......

            <Button
                ...
                android:onClick="@{ () -> authViewModel.lookAroundHandler() }"
                android:text="@{authViewModel.name}"
                ... />

这是相应的观点:

class AuthActivity : AppCompatActivity() {
    private lateinit var authViewModel:AuthViewModel

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_auth)
        authViewModel = ViewModelProviders.of(this).get(AuthViewModel::class.java)
    }
}

这是视图模型

class AuthViewModel:ViewModel() {
    val name = "albert"

    fun lookAroundHandler() {
        println("I am here in view model")
    }
}

dataBinding 已添加到build.gradle

dataBinding {
    enabled = true
}

【问题讨论】:

    标签: android mvvm kotlin


    【解决方案1】:

    您缺少的绑定代码

    val mViewDataBinding = DataBindingUtil.setContentView(this,R.layout.activity_auth);
    

    你不需要添加这一行

    setContentView(R.layout.activity_auth)

    https://developer.android.com/topic/libraries/data-binding/index.html

    【讨论】:

    • 谢谢。似乎很接近。所以我将该行修改为DataBindingUtil.setContentView(this, R.layout.activity_auth) as ActivityAuthBinding。仍然没有任何反应。我刚刚在gradle中添加了`kapt“com.android.databinding:compiler:3.1.1”`,是否足以启用数据绑定?
    • 只需在 gradle 文件中添加 dataBinding { enabled = true }
    【解决方案2】:

    试试这个代码:

    override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    
    binding = DataBindingUtil.setContentView(this, R.layout.activity_person)
    (application as PeopleApplication).applicationComponent.inject(this)
    
    val viewModelFactory: PersonViewModel.Factory = PersonViewModel.Factory(
    personDataManager, this)
    viewModel = ViewModelProviders.of(this, viewModelFactory).get(PersonViewModel::class.java)
    
    binding.friendsList.adapter = PersonFriendListAdapter(viewModel)
    viewModel.personData.observe(this, Observer<Person> { person ->
        binding.person = person
        person?.friends?.let {
            (binding.friendsList.adapter as PersonFriendListAdapter).setItems(person.friends)
        }
    })
     }
    

    检查你的代码一次

    【讨论】:

      猜你喜欢
      • 2019-09-11
      • 2015-11-06
      • 1970-01-01
      • 2017-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多