使用 kotlin-android-extensions 从子模块导入视图时未解析的引用

kos*_*cki 7 android module inject kotlin kotlin-android-extensions

当我尝试在多模块应用程序中使用 kotlin-android-extendions 的视图注入时,从 android.library 子模块注入视图时出现错误:

Unresolved reference: component_xyz_user_name
Run Code Online (Sandbox Code Playgroud)

我们有一个主应用模块和一个 android.library 子模块subm。应用模块引用 subm。这两个模块都使用数据绑定、kapt 和 android-extensions。

在两个模块中,gradle 文件都包含:

apply plugin: 'com.android.library' //or com.android.application
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
apply plugin: 'kotlin-kapt'

android {
    [...]

    dataBinding.enabled = true
    androidExtensions.experimental = true
}
Run Code Online (Sandbox Code Playgroud)

在 subm 库中,我们定义component_user_info.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> [...] </data>

    <android.support.constraint.ConstraintLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical">

        <TextView
            android:id="@+id/component_xyz_user_name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />

    </android.support.constraint.ConstraintLayout>
</layout>
Run Code Online (Sandbox Code Playgroud)

其中component_xyz_user_name认为,我们在下一步会注入。

在主应用程序中,我们定义了一个fragment_main.xml视图,如下所示:

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">

    <data>[...]</data>

    <android.support.design.widget.CoordinatorLayout
        android:id="@+id/news_details_coordinator_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fitsSystemWindows="true">

        <include layout="@layout/component_user_info"
            />

    </android.support.design.widget.CoordinatorLayout>
</layout>
Run Code Online (Sandbox Code Playgroud)

使用以下列方式定义的 ViewModel MainFragmentViewModel

import kotlinx.android.synthetic.main.component_user_info.*

class MainFragment : Fragment() {

    fun updateUserInfo() {
        component_xyz_user_name.text = "ABCDEF"
    }
}
Run Code Online (Sandbox Code Playgroud)

编译失败并出现以下错误:

e: /Users/user/repos/project/app/src/main/java/com/company/users/MainFragment.kt: (108, 9): Unresolved reference: component_xyz_user_name
e: /Users/user/repos/project/app/src/main/java/com/company/users/MainFragment.kt: (109, 9): Unresolved reference: component_xyz_user_name
Run Code Online (Sandbox Code Playgroud)

为什么我得到Unresolved reference: component_xyz_user_name。有什么解决方法吗?

编辑:

作为临时解决方法,我为 Activity & Fragment 编写了以下扩展函数:

/**
 * Find view in an activity
 */
fun <T : View> Activity.v(@IdRes resId: Int): T = findViewById(resId)

/**
 * Find view in a fragment
 */
fun <T : View> Fragment.v(@IdRes resId: Int): T = activity.findViewById(resId)
Run Code Online (Sandbox Code Playgroud)

这样我就可以:

fun updateUserInfo() {
    v<TextView>(R.id.component_xyz_user_name).text = "ABCDEF"
}
Run Code Online (Sandbox Code Playgroud)

Gab*_*ova 0

我遇到了类似的问题 - 我使用 git 添加了一个子模块,但无法在 kotlin 文件中访问它,所以我必须在 build.gradle 中添加这部分:

sourceSets {

    main {
        java {
            srcDir 'src/main/java/module_folder'
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这必须在主要android对象中