Android Fragment实现Data Binding报final类继承等编译错误求助
问题背景
在Android Studio项目中为Fragment实现Data Binding能力,严格遵循官方开发指引的前提下,项目构建阶段无异常,但模拟器启动应用时抛出如下编译错误:
Cannot inherit from final 'com.example....databinding.FragmentFoldersBinding' FragmentFoldersBinding()' has private access in 'com.example...databinding.FragmentFoldersBinding' Cannot resolve symbol 'mAdapter'. Cannot resolve symbol 'mViewModel'
相关代码片段
Fragment类实现
@AndroidEntryPoint class FoldersFragment : Fragment(), FoldersAdapter.FolderClickListener { private lateinit var binding : FragmentFoldersBinding private val vm : FoldersViewModel by activityViewModels() private val adapter : FoldersAdapter by lazy { FoldersAdapter(this as FoldersAdapter.FolderClickListener) } override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View { binding = FragmentFoldersBinding.inflate(inflater) binding.apply { viewModel = vm lifecycleOwner = this@FoldersFragment adapter = adapter } return binding.root } override fun onViewCreated(view: View, savedInstanceState: Bundle?){ super.onViewCreated(view, savedInstanceState) binding.addFolderButton.setOnClickListener { FolderAddDialog().show(childFragmentManager, null) } binding.foldersRecyclerView.isNestedScrollingEnabled = false binding.foldersRecyclerView.layoutManager = LinearLayoutManager(view.context) vm.foldersLiveData.observe(viewLifecycleOwner){ adapter.setData(it) } } override fun onClickedFolder(folder : Folder) { val action = FoldersFragmentDirections.actionFoldersFragmentToNotesFragment(folder) findNavController().navigate(action) } override fun setUpOnItemSwiped(swipe: SwipeCallback) { val itemTouchHelper = ItemTouchHelper(swipe) itemTouchHelper.attachToRecyclerView(binding.foldersRecyclerView) } override fun onDeleteSwiped(folder: Folder) { vm.deleteFolder(folder) } }
布局文件Data Binding配置
<layout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools"> <data> <variable name="viewModel" type="com.example....presentation.folders_feature.FoldersViewModel" /> <variable name="adapter" type="com.example...presentation.folders_feature.FoldersAdapter" /> </data>
问题根因
报错由两个代码问题叠加Data Binding缓存异常导致:
inflate方法调用错误:使用了仅传inflater的单参数重载,该重载不适用于Fragment场景,会导致绑定类初始化逻辑异常- 作用域命名冲突:在
binding.apply作用域内写adapter = adapter时,编译器优先从绑定类实例中查找右侧adapter属性,而非Fragment自身定义的adapter成员,触发绑定类私有字段访问异常 - Data Binding注解处理器在上述两个异常触发时,会错误生成尝试继承final修饰的绑定类、访问私有构造/私有m开头字段的代码,最终抛出三个看似不相关的编译错误
*额外注意:原代码中给binding设置lifecycleOwner时传入Fragment本身是错误用法,会导致内存泄漏,应该使用viewLifecycleOwner对应Fragment的视图生命周期。
修复步骤
- 修正
onCreateView中的inflate调用,替换为适配Fragment的三参数重载:binding = FragmentFoldersBinding.inflate(inflater, container, false) - 修正binding赋值块的作用域问题,同时替换正确的lifecycleOwner:
binding.apply { lifecycleOwner = viewLifecycleOwner viewModel = vm // 明确指定右侧adapter为Fragment的成员,避免作用域冲突 adapter = this@FoldersFragment.adapter } - 清理构建缓存,消除错误生成的中间代码:
- 执行菜单栏
Build -> Clean Project - 清理完成后执行
Build -> Rebuild Project - 若仍有残留报错,关闭Android Studio,删除项目根目录下的
.gradle文件夹、app模块下的build文件夹,重新打开项目同步Gradle即可
- 执行菜单栏
内容的提问来源于stack exchange,提问作者Leonid06
相关产品推荐
相关产品推荐

