Android Studio Kotlin开发时VideoView为空报错如何解决
问题成因
- 未调用
setContentView()加载布局:你使用kotlin-android-extensions的合成控件属性(即kotlinx.android.synthetic导入的控件引用)的前提是Activity已经关联了布局文件,你在onCreate中没有绑定布局,所有控件引用都会为空。 - Uri格式错误:资源路径的格式写错,
android.resource后缺少冒号,路径前缀顺序错误,会导致无法正确定位视频资源。 - kotlin-android-extensions已废弃:目前Android官方已经移除了对kotlin-android-extensions的支持,如果你使用的是较高版本的Android Gradle插件,合成控件属性默认失效,也会导致控件引用为空。
解决方案
方案1:快速修复原有代码
直接补全布局绑定逻辑、修正Uri格式即可,修改后代码如下:
package com.ai.sleepassistant import android.net.Uri import android.os.Bundle import androidx.appcompat.app.AppCompatActivity import kotlinx.android.synthetic.main.activity_intro.* class Intro : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // 新增:绑定布局文件 setContentView(R.layout.activity_intro) // 修正Uri格式 val offlineUri = Uri.parse("android.resource://$packageName/${R.raw.introa}") video_view?.apply { setVideoURI(offlineUri) setOnPreparedListener { start() } } } }
说明:用?.apply替代非空判断写法更符合Kotlin规范,也能避免空安全报错
方案2:使用官方推荐的View Binding(推荐长期使用)
由于kotlin-android-extensions已经被废弃,建议切换为View Binding实现控件引用,步骤如下:
- 先在模块级的
build.gradle中开启View Binding:
android { buildFeatures { viewBinding true } }
- 修改Activity代码:
package com.ai.sleepassistant import android.net.Uri import android.os.Bundle import androidx.appcompat.app.AppCompatActivity import com.ai.sleepassistant.databinding.ActivityIntroBinding class Intro : AppCompatActivity() { private lateinit var binding: ActivityIntroBinding override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = ActivityIntroBinding.inflate(layoutInflater) setContentView(binding.root) val offlineUri = Uri.parse("android.resource://$packageName/${R.raw.introa}") binding.videoView.apply { setVideoURI(offlineUri) setOnPreparedListener { start() } } } }
该方案完全规避了空安全问题,是官方推荐的写法
内容的提问来源于stack exchange,提问作者jjolatunji
相关产品推荐
相关产品推荐

