You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 20:15:39