ViewBinding/DataBinding与<include>配合异常:返回View而非Binding实例
ViewBinding嵌套时,content_main.xml对应的Binding类型异常问题
在使用ViewBinding实现布局嵌套(结构为activity_main.xml -> content_main.xml -> entry_card.xml)时,遇到一个诡异问题:当布局文件名为content_main.xml时,binding.content返回的类型是android.view.View而非预期的ContentMainBinding,导致无法访问内层的EntryCardBinding。
仅原项目文件夹会出现此问题,复制项目文件夹打开副本或修改文件名(比如改成content_mainn.xml)后,binding.content就能正常返回ContentMainBinding类型。
已尝试的无效操作
- 清理项目
- 重建项目
- 清除Android Studio缓存并重启
- 改用DataBinding替代ViewBinding
- 切换Android Studio版本至Dolphin 2021.3.1 RC 1
- 修改
标签的id为其他名称
有效解决方案
- 复制项目文件夹并打开副本
- 修改布局文件名为非
content_main的名称(如content_mainn.xml)
相关代码
activity_main.xml
<?xml version="1.0" encoding="utf-8"?> <layout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools"> <androidx.coordinatorlayout.widget.CoordinatorLayout android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="true" tools:context=".MainActivity"> <com.google.android.material.appbar.AppBarLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:fitsSystemWindows="true"> <com.google.android.material.appbar.MaterialToolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" /> </com.google.android.material.appbar.AppBarLayout> <include android:id="@+id/content" layout="@layout/content_main" /> </androidx.coordinatorlayout.widget.CoordinatorLayout> </layout>
content_main.xml
<?xml version="1.0" encoding="utf-8"?> <layout xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:android="http://schemas.android.com/apk/res/android"> <androidx.constraintlayout.widget.ConstraintLayout android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:id="@+id/textView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="8dp" android:text="Example" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" app:layout_constraintBottom_toBottomOf="parent" /> </androidx.constraintlayout.widget.ConstraintLayout> </layout>
MainActivity.kt
class MainActivity : AppCompatActivity() { private lateinit var binding: ActivityMainBinding override fun onCreate(savedInstanceState: Bundle?) { WindowCompat.setDecorFitsSystemWindows(window, false) super.onCreate(savedInstanceState) binding = ActivityMainBinding.inflate(layoutInflater) setContentView(binding.root) binding.content // Returns android.view.View instead of ContentMainBinding setSupportActionBar(binding.toolbar) } }
问题分析与建议
这种异常大概率是原项目目录下存在常规清理操作无法清除的残留缓存或损坏构建产物。Android Studio的构建缓存可能针对content_main.xml这个文件名保留了错误的生成记录,复制项目相当于重建了干净的构建环境,修改文件名则避开了异常缓存。
如果不想修改文件名,可以尝试手动删除项目根目录下的.gradle、.idea文件夹以及所有模块的build文件夹,然后重新打开项目并构建,彻底清除所有可能的残留配置和缓存文件。
内容的提问来源于stack exchange,提问作者Giacomo Ferretti
相关产品推荐
相关产品推荐

