Use Kotlin Android Extensions

本文介绍Kotlin Android Extensions插件如何简化Android开发中常见的findViewById()问题,通过使用XML中定义的android:id直接引用视图,提高开发效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

kotlin-android-extensions用于扩展绑定关系,为了解决findViewById()的问题。

背景

Android开发中,findViewById()是比较烦人的一个函数,开源界已经有几个库提供了解决办法,比如:ButterKnife,DataBinding等。

kotlin-android-extensions插件提供了一种方便的解决办法, 不用增加额外的代码,直接使用xml中定义的android:id就可以引用view, 例如:

// Using R.layout.activity_main from the main source set
import kotlinx.android.synthetic.main.activity_main.*

class MyActivity : Activity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        textView.setText("Hello, world!")
        // Instead of findView(R.id.textView) as TextView
    }
}

配置

  • 项目的 build.gradle 添加依赖
    classpath “org.jetbrains.kotlin:kotlin-android-extensions:$kotlin_version”
  • app 的 build.gradle 使用插件
    apply plugin: ‘kotlin-android-extensions’
  • 在代码开头 import 布局文件的属性
    import kotlinx.android.synthetic.main..*

示例

布局文件res/layout/activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

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

</android.support.constraint.ConstraintLayout>

下面,使用两种方式写MainActivity。

  • 使用findViewById()
class MainActivity : AppCompatActivity() {
    private var mTextMessage: TextView? = null
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        mTextMessage = findViewById(R.id.message) as TextView
        mTextMessage!!.setText("Hello world")
    }
}
  • 使用kotlin-android-extensions
import kotlinx.android.synthetic.main.activity_main.*

class MainActivity : AppCompatActivity() {
    private var mTextMessage: TextView? = null
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        message.setText("Hello world");
    }
}

参考:Kotlin Android Extensions

安卓报错Could not resolve all files for configuration ':gst_doctor:debugRuntimeClasspath'. > Failed to transform kotlin-android-extensions-1.8.20.jar (org.jetbrains.kotlin:kotlin-android-extensions:1.8.20) to match attributes {artifactType=enumerated-runtime-classes, org.gradle.category=library, org.gradle.libraryelements=jar, org.gradle.status=release, org.gradle.usage=java-runtime}. > Execution failed for JetifyTransform: C:\Users\admin\.gradle\caches\modules-2\files-2.1\org.jetbrains.kotlin\kotlin-android-extensions\1.8.20\6f25b7cf95167fbf487125a71758de4c0aa15da2\kotlin-android-extensions-1.8.20.jar. > Failed to transform 'C:\Users\admin\.gradle\caches\modules-2\files-2.1\org.jetbrains.kotlin\kotlin-android-extensions\1.8.20\6f25b7cf95167fbf487125a71758de4c0aa15da2\kotlin-android-extensions-1.8.20.jar' using Jetifier. Reason: AmbiguousStringJetifierException, message: The given artifact contains a string literal with a package reference 'android.support.v4' that cannot be safely rewritten. Libraries using reflection such as annotation processors need to be updated manually to add support for androidx.. (Run with --stacktrace for more details.) This is a known exception, and Jetifier won't be able to jetify this library. Suggestions: - If you believe this library doesn't need to be jetified (e.g., if it already supports AndroidX, or if it doesn't use support libraries/AndroidX at all), add android.jetifier.blacklist = {comma-separated list of regular expressions (or simply names) of the libraries that you don't want to be jetified} to the gradle.properties file. - If you believe this library needs to be jetified (e.g., if it uses old support libraries and breaks your app if it isn't jetified), contact the library's authors to update this library to support AndroidX and use the supported version once it is released.
04-01
<think>嗯,用户又遇到了一个和之前类似的Android构建错误,这次是关于无法解析配置':gst_doctor:debugRuntimeClasspath'的问题,错误信息同样提到了Jetifier转换失败,特别是kotlin-android-extensions-1.8.20.jar中的'android.support.v4'包引用。看起来用户可能之前尝试过升级到1.8.20版本,但问题依旧存在,或者他们按照之前的建议操作后仍然遇到了问题。 首先,我需要回顾之前的对话。上次用户遇到的错误是关于kotlin-android-extensions-1.8.0.jar的Jetifier转换问题,我建议他们升级到1.8.20或更高版本,或者改用View Binding。现在用户升级到了1.8.20,但问题依然存在,说明这个版本的插件可能仍然包含不兼容的代码。 接下来,我需要理解当前错误的具体原因。错误信息中提到,尽管升级到了1.8.20,但该库仍然引用了android.support.v4,导致Jetifier无法自动转换。这可能是因为即使较新版本的kotlin-android-extensions仍然没有完全迁移到AndroidX,或者存在某些遗留代码。根据JetBrains的官方文档,kotlin-android-extensions已经被废弃,推荐使用View Binding或Data Binding,因此可能这个库的后续版本并没有完全修复AndroidX的兼容性问题。 用户现在需要更彻底的解决方案,而不仅仅是升级版本。可能需要完全移除对kotlin-android-extensions的依赖,改用其他替代方案。同时,错误信息中还提到了可能的解决方法,比如在gradle.properties中添加黑名单,或者联系库作者更新库。不过,由于这个库是JetBrains官方的,用户可能无法直接联系作者,但需要知道官方已经废弃该插件,所以最佳做法是迁移到推荐的方式。 另外,用户可能对如何正确配置黑名单或如何迁移到View Binding还存在疑问。需要详细说明每一步操作,包括如何移除插件、启用View Binding,并修改代码中的引用。同时,用户可能需要检查其他依赖项是否也包含旧的support库,避免混合使用AndroidX和support库导致的问题。 还需要考虑用户是否在迁移过程中遗漏了某些步骤,例如是否正确执行了Android Studio的迁移工具,或者是否有其他依赖项需要更新。此外,临时解决方案如禁用Jetifier或添加黑名单虽然可以暂时解决问题,但长期来看可能存在风险,需要提醒用户注意。 总结下来,用户的主要问题还是在于使用了已废弃的kotlin-android-extensions插件,并且该插件即使在较新版本中仍然存在对旧支持库的引用。解决方案应着重于完全移除该插件,并迁移到官方推荐的替代方案,如View Binding,同时确保所有依赖项都兼容AndroidX。</think>--- ### **问题本质** 该错误与之前类似,核心仍是 **`kotlin-android-extensions` 插件包含无法被 Jetifier 自动迁移到 AndroidX 的旧支持库(`android.support.v4`)**,导致构建时 Jetifier 转换失败。**即使升级到 1.8.20 版本,此插件仍可能遗留对旧包的硬编码引用**(如反射或字符串直接调用)。 --- ### **分步解决方案** #### **方案一:彻底弃用 `kotlin-android-extensions`(推荐)** 该插件已被官方废弃,**优先改用 View Binding 或 Data Binding**: 1. **移除插件依赖** 在模块的 `build.gradle` 中: ```groovy // 删除以下内容: apply plugin: 'kotlin-android-extensions' ``` 2. **启用 View Binding** 在模块的 `build.gradle` 中: ```groovy android { buildFeatures { viewBinding true } } ``` 3. **代码迁移** - 替换所有 `kotlinx.android.synthetic` 的视图引用方式,改用生成的 Binding 类。 - 例如,原代码: ```kotlin // 删除旧方式 import kotlinx.android.synthetic.main.activity_main.* textView.text = "Hello" ``` 改为: ```kotlin private lateinit var binding: ActivityMainBinding override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = ActivityMainBinding.inflate(layoutInflater) setContentView(binding.root) binding.textView.text = "Hello" } ``` --- #### **方案二:临时绕过 Jetifier 转换(应急)** 若需暂时保留 `kotlin-android-extensions`,可将其加入 Jetifier 黑名单: 1. **修改 `gradle.properties`** 添加以下配置: ```properties # 跳过对 kotlin-android-extensions 的 Jetifier 转换 android.jetifier.blacklist = org.jetbrains.kotlin:kotlin-android-extensions ``` 2. **风险说明** - **仅当此库已原生支持 AndroidX 时生效**(但实际它仍依赖旧包,因此可能引发运行时崩溃)。 - 此方案是临时应急,长期仍需彻底迁移。 --- #### **方案三:强制清理 Gradle 缓存** 若怀疑缓存污染,手动清理 Gradle 缓存: 1. 关闭 Android Studio。 2. 删除缓存目录: - Windows:`C:\Users\你的用户名\.gradle\caches` - macOS/Linux:`~/.gradle/caches` 3. 重新同步项目并构建。 --- ### **辅助排查步骤** 1. **检查依赖冲突** 运行命令查看依赖树: ```bash ./gradlew :gst_doctor:dependencies --configuration debugRuntimeClasspath ``` 检查是否其他库仍依赖 `android.support.*`。 2. **确保完整迁移到 AndroidX** 在 Android Studio 中执行: **Refactor > Migrate to AndroidX** 确认所有代码和依赖库已迁移。 3. **更新其他依赖库** 检查 `build.gradle` 中第三方库的版本,确保其已适配 AndroidX(如 `com.android.support` 替换为 `androidx.*`)。 --- ### **根本原因与预防** - **废弃插件问题**:`kotlin-android-extensions` 已废弃且官方不再维护,其内部可能残留对旧支持库的硬编码引用。 - **预防措施**: - 彻底迁移到 View Binding 或 Data Binding。 - 避免使用任何依赖 `android.support.*` 的库。 - 定期更新项目依赖至最新稳定版。 --- ### **总结** **优先选择方案一**(迁移到 View Binding),这是官方推荐且一劳永逸的解决方案。若需临时构建,可尝试方案二或清理缓存,但需承担潜在兼容性风险。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值