android - Databinding V2 和 kotlin,我找不到我的 BT?

标签 android data-binding kotlin

昨天,我将我的 Android Studio 更新到了 3.1。所以我只能使用Databinding V2。我可以在Java中成功构建。但在Kotlin中失败。它告诉我Unresolved reference: BR

布局

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
    <data>
        <variable
            name="mainViewModel"
            type="com.example.shao.myapplication.ViewModel" />
    </data>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{mainViewModel.title}"/>
    </LinearLayout>
</layout>

在Java中

public class MainActivity2 extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
    binding.setVariable(BR.mainViewModel, new ViewModel());
}


public static int getMainBr() {
    return BR.mainViewModel;
}

在 Kotlin 中

class MainActivity : AppCompatActivity() {

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    val mBinding = DataBindingUtil.setContentView<ActivityMainBinding>(this, R.layout.activity_main)
    mBinding.setVariable(BR.mainViewModel, ViewModel())
}
}

enter image description here

最佳答案

Android 与 Kotlin 的数据绑定(bind)

首先,在 Android Studio 中创建好 Android 项目后,我们需要将 Data Binding 依赖和 Kotlin 的依赖添加到我们应用的 build.gradle 文件中。

apply plugin: 'kotlin-android'                       
apply plugin: 'kotlin-kapt'
android {
....
dataBinding {
    enabled = true
}
}
dependencies {
...
// notice that the compiler version must be the same than our gradle version
kapt 'com.android.databinding:compiler:2.3.1'
}

首先我们需要创建一个模型。在这种情况下,基本的像 User.kt

data class User(val name: String, val age: Int)

activity_main.xml

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

    <variable
        name="user"
        type="com.kuma.sample.User"
        />
</data>

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.kuma.sample.MainActivity"
    >

    <TextView
        android:id="@+id/user_name_text_view"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="16dp"
        android:text="@{user.name}"
        tools:text="Name"
        />

    <TextView
        android:id="@+id/user_age_text_view"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="16dp"
        android:text="@{Integer.toString(user.age)}"
        tools:text="XX"
        />

</LinearLayout>

 </layout>

Kotlin 类

package com.kuma.sample

 import android.databinding.DataBindingUtil
 import android.os.Bundle
 import android.support.v7.app.AppCompatActivity
 import com.kuma.kotlinsteps.databinding.ActivityMainBinding

 class MainActivity : AppCompatActivity() {

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    val binding: ActivityMainBinding = DataBindingUtil.setContentView(this, R.layout.activity_main)

    val user = User("Kuma", 23)
    binding.setVariable(BR.user, user)
    binding.executePendingBindings()
}

}

解决错误Br

enter code hereapply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
 android {
compileSdkVersion 24
buildToolsVersion "24.0.0"

defaultConfig {
applicationId "com.example.icarusud.recyclerviewtest"
minSdkVersion 15
targetSdkVersion 24
versionCode 1
versionName "1.0"
}
buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
}
dataBinding {
    enabled true
}
sourceSets {
    main.java.srcDirs += 'src/main/kotlin'
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:24.1.1'
compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"

//recyclerview
compile "com.android.support:recyclerview-v7:24.1.1"

 //lastadapter
  compile 'com.github.nitrico.lastadapter:lastadapter:1.1.1'

kapt "com.android.databinding:compiler:2.1.2"
}
repositories {
mavenCentral()
}

kapt { generateStubs = true }

根据下面的代码更改你的 gradle 设置试试这个代码它可以帮助你。

关于android - Databinding V2 和 kotlin,我找不到我的 BT?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49526041/

相关文章:

java - 即使调用notifydatasetchanged()后,我的 ListView 也没有更新

android - appwidget listview 重复值

Android - 在 java 和 NDK 中为 PIXEL 获取不同的值

c# - Winforms、数据绑定(bind)、列表框和文本框

java - 无法解析 Kotlin 1.1.0 编译中的符号 @ReadOnly 和 @Mutable

Android - 将图像文件发送到服务器数据库

c# - 更改 ListBox 的选择会更改其他 ListBox 的选择。这是怎么回事?

android - 无法通过 DataBinding 或 Android 扩展访问 View

generics - Kotlin "out"和 "in"和泛型 - 正确使用

kotlin - 使用类字段的Kotlin Data类 setter