android - 使用 kotlin-android-extensions 从子模块导入视图时未解决的引用
问题描述
当我尝试在多模块应用程序中使用 kotlin-android-extendions 的视图注入时,从 android.library 子模块注入视图时出现错误:
Unresolved reference: component_xyz_user_name
我们有一个主应用模块和一个 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
}
在 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>
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>
使用以下方式定义的 ViewModel MainFragmentViewModel :
import kotlinx.android.synthetic.main.component_user_info.*
class MainFragment : Fragment() {
fun updateUserInfo() {
component_xyz_user_name.text = "ABCDEF"
}
}
编译失败并出现以下错误:
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
为什么我得到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)
这样我就可以:
fun updateUserInfo() {
v<TextView>(R.id.component_xyz_user_name).text = "ABCDEF"
}
解决方案
我有一个类似的问题 - 我使用 git 添加了一个子模块,但我无法在 kotlin 文件中访问它,所以我必须在 build.gradle 中添加这部分:
sourceSets {
main {
java {
srcDir 'src/main/java/module_folder'
}
}
}
这必须在主要android
对象中
推荐阅读
- sql - 无法确定连接查询
- python - MyPy 无法识别修饰函数的返回类型
- javascript - Javascript - 通过其名称和存储在变量中的参数调用函数,(理想情况下没有`eval`,但如果只有这样就可以了)
- python - Discord.py 如何让命令忽略参数
- java - 实现抽象类的类的类型与抽象类的泛型类型不兼容
- args - For循环不循环通过args
- python - 尝试与 JMP 中的 Python 脚本交互
- php - 变量“可能未定义” - 我错过了什么吗?
- python - pandasql 在函数中不起作用
- strlen - strlen (php) 没有给出正确的结果