Kotlin Fragment中LayoutInflater.from(this)等this报错解决方案
问题根源
所有传入this的位置标红,核心原因是Fragment本身不是Context子类。你参考的教程逻辑是写在Activity中的,Activity直接继承自Context,所以传this合法,但Fragment不能直接把自身实例作为Context/Activity类型参数传入。不需要把Fragment改成Activity,修复参数类型问题即可,完全不会改动App现有外观。
另外你现有代码还存在几处逻辑错误,一并修复就能正常运行。
修复步骤
- 补全控件绑定,避免空指针
你在inflate完Fragment的ViewBinding之后,没有把控件实例赋值给声明的addsBtn、recv变量,运行时会直接触发空指针。在onCreateView中inflate binding后补充两行代码:val bind = FragmentBlankBinding.inflate(layoutInflater) // 补充以下两行绑定控件 addsBtn = bind.addingBtn recv = bind.mRecycler - 替换所有需要Context参数位置的
this
所有要求传入Context的位置,统一用requireContext()代替this,这个方法会在Fragment已附着到Activity时返回合法的非空Context实例,安全性高于直接调用activity:UserAdapter(this,userList)改为UserAdapter(requireContext(), userList)(如果Adapter构造函数要求传入Activity类型参数,就替换为requireActivity())LayoutInflater.from(this)改为LayoutInflater.from(requireContext())AlertDialog.Builder(this)改为AlertDialog.Builder(requireContext())
- 删除错误的Intent跳转代码
你当前写的两段Intent跳转逻辑完全无效:Intent的第二个参数必须是目标Activity的Class对象,你传入的addsBtn::class.java、recv::class.java是控件类,跳转必然崩溃。你已经给悬浮按钮写了点击弹出新增对话框的逻辑,前面重复写的跳转代码直接删除即可。如果RecyclerView需要点击跳转到其他页面,把Intent的第二个参数替换成对应目标Activity的Class即可。 - 修正弹窗布局加载逻辑
加载自定义弹窗布局时不要传null作为父布局,否则会导致布局参数失效,修正后的addInfo方法代码如下:private fun addInfo() { val inflater = LayoutInflater.from(requireContext()) val v = inflater.inflate(R.layout.add_item, view as? ViewGroup, false) val addDialog = AlertDialog.Builder(requireContext()) addDialog.setView(v) addDialog.setPositiveButton("Ok"){ dialog,_-> // 此处编写新增条目的业务逻辑,比如读取输入框内容、更新列表、刷新适配器 dialog.dismiss() } addDialog.setNegativeButton("Cancel"){ dialog,_-> dialog.dismiss() } addDialog.show() } - 补全RecyclerView配置
初始化完userAdapter之后,记得给RecyclerView设置适配器,否则列表不会展示内容:userAdapter = UserAdapter(requireContext(),userList) recv.adapter = userAdapter
修复后核心代码参考
override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?, ): View? { userList = ArrayList() val bind = FragmentBlankBinding.inflate(layoutInflater) addsBtn = bind.addingBtn recv = bind.mRecycler userAdapter = UserAdapter(requireContext(),userList) recv.adapter = userAdapter addsBtn.setOnClickListener { addInfo() } return bind.root }
注意:
requireContext()和requireActivity()需要在Fragment附着到Activity之后调用,在onCreateView及之后的生命周期方法中调用是安全的,不会出现空指针问题。
内容的提问来源于stack exchange,提问作者alpheratz
相关产品推荐
相关产品推荐

