android - 无法使用数据绑定(bind) Android 从 ViewModel 与 XML 通信

标签 android mvvm kotlin data-binding dagger

我正在尝试使用 MVVM 模式从 xml 与 viewmodel 进行通信,反之亦然。我之前从事过数据绑定(bind)工作,并成功使用过 实时数据 - Dagger - MVVM .
最近,我尝试创建一个新项目,从那以后我无法使用 XML 和 viewmodel 跟踪响应。来自 的 onClick 都不是XML -> View 模型 也不是从 为 textview 赋值查看 -> XML 正在工作中。但是没有崩溃或任何东西,只是它不工作。我已添加所有相关文件 [ MainActivity,activity_main,viewModel,Dagger 模块,build.gradle ]

如果有人能告诉我这里出了什么问题,我将不胜感激。

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<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="aveek.com.vm.ui.home.MainActivityViewModel"/>
</data>
<android.support.constraint.ConstraintLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

 <TextView

        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@{viewmodel.balanceText}"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        android:clickable="true"
        android:onClick="@{() -> viewmodel.clickData()}"
        app:layout_constraintTop_toTopOf="parent" />
...
</layout>

MainActivity.kt
class MainActivity : AppCompatActivity(),LifecycleOwner {

@Inject
lateinit var binding : ActivityMainBinding

override fun onCreate(savedInstanceState: Bundle?) {
    AndroidInjection.inject(this)
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    binding.setLifecycleOwner(this) 
    with(binding){
        this.viewmodel?.let {
            it.balanceText.set( "Aveek testing")
            it.data.observe(this@MainActivity, Observer {
                Toast.makeText(this@MainActivity, "Data is now : $it", Toast.LENGTH_SHORT).show()
            })
           }
         }
       }

MainActivityViewModel.kt
class MainActivityViewModel : ViewModel() {
val data = MutableLiveData<Boolean>()
val balanceText = ObservableField<String>()
 fun clickData(){
    data.value = false
 }
}

MainActivityModule.kt
@Module
class  MainActivityModule{

/**
 * provides binding to  Main Activity from respective XML
 * @property viewModel
 * @property context
 * @return binding of the view
 */
@Provides
fun binding(context: MainActivity, viewModel : MainActivityViewModel) : 
ActivityMainBinding {
    val binding = DataBindingUtil.setContentView<ActivityMainBinding>(context, 
    R.layout.activity_main)
    binding.viewmodel = viewModel
    return binding
 }
}

build.gradle
apply plugin: 'com.android.application'

apply plugin: 'kotlin-android'

apply plugin: 'kotlin-android-extensions'

apply plugin: 'kotlin-kapt'

android {
   compileSdkVersion 27
   defaultConfig {
    applicationId "aveek.test"
    minSdkVersion 15
    targetSdkVersion 27
    versionCode 1
    versionName "1.0"
    testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    vectorDrawables.useSupportLibrary = true
   }
   dataBinding {
    enabled = true
   }
   buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 
     'proguard-rules.pro'
    }
    }
    compileOptions {
     sourceCompatibility JavaVersion.VERSION_1_8
     targetCompatibility JavaVersion.VERSION_1_8
    }
   }

kapt {
  generateStubs = true
}

dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
implementation 'com.android.support:appcompat-v7:27.1.1'
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
implementation 'com.android.support:multidex:1.0.2'
implementation 'com.android.support:design:27.1.1'
implementation "android.arch.lifecycle:extensions:1.1.0"
//    annotationProcessor "android.arch.lifecycle:compiler:1.1.0"

kapt "com.android.databinding:compiler:$androidPluginVersion"

annotationProcessor "com.google.dagger:dagger-compiler:$daggerVersion"
annotationProcessor "com.google.dagger:dagger-android-processor:$daggerVersion"
kapt "com.google.dagger:dagger-compiler:$daggerVersion"
kapt "com.google.dagger:dagger-android-processor:$daggerVersion"


implementation "com.google.dagger:dagger:$daggerVersion"
implementation "com.google.dagger:dagger-android:$daggerVersion"
implementation "com.google.dagger:dagger-android-support:$daggerVersion"
kapt "com.google.dagger:dagger-compiler:$daggerVersion"

testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso- 
core:3.0.2'

}


ext{
    kotlin_version = '1.2.31'
    androidPluginVersion = '3.1.0'
    daggerVersion = '2.13'
}

最佳答案

you won't be able to use any generated methods to set your variable to the binding, as there's no common superclass besides the ViewDataBinding,so you will be forced to use reflection, or you can use the convenience method setVariable():


binding.setVariable(BR.viewModel, viewModel);

关于android - 无法使用数据绑定(bind) Android 从 ViewModel 与 XML 通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55393371/

相关文章:

c# - Wpf中的中继命令

c# - 异步 CTP,单元测试 ViewModel 的异步方法

android - 无法访问 BaseColumns 在 Kotlin 中提供了 _ID 属性

android - aapt错误138 processDebugResources

java - IllegalArgumentException:文件包含路径分隔符 Android

wpf - 在 ViewModel 中使用内置 WPF 命令

android - Kotlin 在 fragment 中显示类型不匹配

单线程的 Java 线程池未按预期运行

android - NotificationListenerService 安卓穿戴

Android - 如何从字符串中解析 JsonArray?