Java转Kotlin后BookingActivity崩溃,Logcat报svInfo.flags=8及NoSuchMethodError
解决ButterKnife导致的Java NoSuchMethodError崩溃问题
首先要明确:你看到的input svInfo.flags is 8日志是Android系统GPS相关的日志,和当前应用崩溃完全无关,不用在意它。真正导致崩溃的是Logcat里的java.lang.NoSuchMethodError: No static method metafactory错误,根源是ButterKnife与Java 8兼容性不匹配,再加上Kotlin项目的配置问题。
下面给你两种解决方案,优先推荐第二种(更适配Kotlin的官方方案):
方案一:修复ButterKnife的兼容性问题
配置Java 8支持
ButterKnife从10.0版本开始依赖Java 8特性,需要在你的app模块build.gradle中添加Java 8编译配置:android { // 其他配置... compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } kotlinOptions { jvmTarget = "1.8" } }锁定稳定的ButterKnife版本
建议使用ButterKnife最后一个稳定版本10.2.3,避免版本冲突:dependencies { implementation 'com.jakewharton:butterknife:10.2.3' annotationProcessor 'com.jakewharton:butterknife-compiler:10.2.3' }
方案二:替换为View Binding(推荐,适配Kotlin)
ButterKnife已经被Google官方弃用,Kotlin项目更适合使用View Binding(官方内置功能,无第三方依赖,空安全),步骤如下:
启用View Binding
在app模块build.gradle中开启View Binding:android { // 其他配置... buildFeatures { viewBinding true } }重构BookingActivity代码
移除所有ButterKnife相关代码,用View Binding替代:class BookingActivity : AppCompatActivity() { // 声明View Binding对象 private lateinit var binding: ActivityBookingBinding override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // 初始化Binding并设置布局 binding = ActivityBookingBinding.inflate(layoutInflater) setContentView(binding.root) setupStepView() setColorButton() // 使用Binding对象访问控件,无需!!,自动空安全 binding.viewPager.adapter = MyViewPagerAdapter(supportFragmentManager) binding.viewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { override fun onPageScrolled( position: Int, positionOffset: Float, positionOffsetPixels: Int) {} override fun onPageSelected(position: Int) { binding.btnPreviousStep.isEnabled = position != 0 setColorButton() } override fun onPageScrollStateChanged(state: Int) {} }) } private fun setupStepView() { val stepList = arrayListOf("Clinic", "Doctor", "Time", "Confirmation") binding.stepView.setSteps(stepList) } private fun setColorButton() { val primaryColor = R.color.colorPrimary val darkPrimaryColor = R.color.colorPrimaryDark // 修复你之前的笔误:之前btn_previous_step不管是否enabled都用colorPrimary binding.btnNextStep.setBackgroundResource(if (binding.btnNextStep.isEnabled) primaryColor else darkPrimaryColor) binding.btnPreviousStep.setBackgroundResource(if (binding.btnPreviousStep.isEnabled) primaryColor else darkPrimaryColor) } }清理ButterKnife依赖
从build.gradle中移除所有ButterKnife相关的依赖项,避免残留问题。
额外说明
- View Binding会根据你的布局文件自动生成对应的Binding类(比如
ActivityBookingBinding对应activity_booking.xml),所有控件都会被自动绑定,无需手动查找。 - 你之前代码中使用的
!!非空断言存在空指针风险,View Binding完全避免了这个问题,更适合Kotlin的空安全特性。
内容的提问来源于stack exchange,提问作者Pattaya Eye-dee
相关产品推荐
相关产品推荐

