Android Studio布局文件中的控件在代码中引用提示Unresolved reference错误
问题原因
你代码中直接使用dancerView、studentView、playbtn等布局ID作为变量调用,但Android原生Kotlin开发默认不支持该语法,该语法依赖已废弃的Kotlin Android Extensions插件,默认项目未开启该功能,因此编译器找不到对应变量引用。
解决方案
方案1:使用findViewById(无需额外配置,适合新手快速验证)
在setContentView(R.layout.activity_main)之后手动绑定控件,修改后的onCreate代码如下:
const val REQUEST_VIDEO_CAPTURE = 1 class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) // 手动绑定控件 val dancerView = findViewById<VideoView>(R.id.dancerView) val studentView = findViewById<VideoView>(R.id.studentView) val playbtn = findViewById<Button>(R.id.playbtn) // 原有逻辑补全 var path_vid = "android.resource://${packageName}/${R.raw.test_720}" var mediaController = MediaController(this) mediaController.setAnchorView(dancerView) // 补充缺失的播放配置 dancerView.setMediaController(mediaController) dancerView.setVideoPath(path_vid) // 点击按钮播放 playbtn.setOnClickListener { dancerView.start() } } }
方案2:使用View Binding(官方推荐,类型安全无空风险)
这是目前Google官方推荐的控件绑定方案,配置步骤如下:
- 打开项目中
app模块下的build.gradle(Groovy语法)或build.gradle.kts(Kotlin语法)文件,在android代码块中添加ViewBinding开启配置:// Groovy语法 android { // 其他原有配置 buildFeatures { viewBinding true } }// Kotlin语法 android { // 其他原有配置 buildFeatures { viewBinding = true } } - 点击Android Studio右上角的「Sync Now」同步项目配置
- 修改MainActivity代码使用ViewBinding绑定控件:
const val REQUEST_VIDEO_CAPTURE = 1 class MainActivity : AppCompatActivity() { // 定义Binding变量 private lateinit var binding: ActivityMainBinding override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // 初始化Binding binding = ActivityMainBinding.inflate(layoutInflater) setContentView(binding.root) // 直接通过binding访问所有控件,无需手动findViewById var path_vid = "android.resource://${packageName}/${R.raw.test_720}" var mediaController = MediaController(this) mediaController.setAnchorView(binding.dancerView) // 补充播放配置 binding.dancerView.setMediaController(mediaController) binding.dancerView.setVideoPath(path_vid) binding.playbtn.setOnClickListener { binding.dancerView.start() } } }
补充注意事项
如果你的视频文件还没导入,需要先在res目录下新建raw文件夹,将你的test_720视频文件放入该文件夹才能正常读取。
内容的提问来源于stack exchange,提问作者EJ Song
相关产品推荐
相关产品推荐

