You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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的兼容性问题

  1. 配置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"
        }
    }
    
  2. 锁定稳定的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(官方内置功能,无第三方依赖,空安全),步骤如下:

  1. 启用View Binding
    在app模块build.gradle中开启View Binding:

    android {
        // 其他配置...
        buildFeatures {
            viewBinding true
        }
    }
    
  2. 重构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)
        }
    }
    
  3. 清理ButterKnife依赖
    从build.gradle中移除所有ButterKnife相关的依赖项,避免残留问题。

额外说明

  • View Binding会根据你的布局文件自动生成对应的Binding类(比如ActivityBookingBinding对应activity_booking.xml),所有控件都会被自动绑定,无需手动查找。
  • 你之前代码中使用的!!非空断言存在空指针风险,View Binding完全避免了这个问题,更适合Kotlin的空安全特性。

内容的提问来源于stack exchange,提问作者Pattaya Eye-dee

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 18:22:30