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

Android开发CallFragment点击btnSetupVideoCall无法跳转Activity求助

问题根源

你在CallFragment中初始化View Binding的方式错误,导致点击事件没有绑定到实际显示的按钮上:
你在onCreateView中手动inflate布局返回作为Fragment的显示视图,但是在onViewCreated中又重新inflate了一个全新的Binding实例,这个实例对应的View没有被添加到视图层级中,绑定的点击事件自然不会触发。


修复步骤

1. 修改CallFragment的Binding初始化逻辑

class CallFragment : Fragment() {
    private var param1: String? = null
    private var param2: String? = null
    private lateinit var binding: FragmentCallBinding
    companion object {
        @JvmStatic
        fun newInstance(param1: String, param2: String) =
            CallFragment().apply {
                arguments = Bundle().apply {
                    putString(ARG_PARAM1, param1)
                    putString(ARG_PARAM2, param2)
                }
            }
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        arguments?.let {
            param1 = it.getString(ARG_PARAM1)
            param2 = it.getString(ARG_PARAM2)
        }
    }

    // 修改onCreateView,直接通过Binding inflate布局
    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        binding = FragmentCallBinding.inflate(inflater, container, false)
        return binding.root
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        // 删除原有重新inflate Binding的代码,直接使用已经初始化的binding
        binding.btnSetupVideoCall.setOnClickListener{
            // 使用requireActivity()替代强转,更安全
            val intent = Intent(requireActivity(), One_to_One_VC::class.java)
            startActivity(intent)
        }
    }
}

2. 可选优化:修复MainActivity的Fragment实例复用问题

你当前的onBackPressed逻辑每次切回CallFragment都会新建实例,会造成不必要的资源消耗,修改为复用已创建的实例即可:

class MainActivity : AppCompatActivity() {
    private lateinit var binding: ActivityMainBinding
    // 将Fragment实例提升为成员变量,方便全局复用
    private val callFragment = CallFragment()
    private val chatFragment = ChatFragment()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)

        makeCurrentFragment(callFragment)
        binding.btmNvg.setOnNavigationItemSelectedListener {
            when (it.itemId) {
                R.id.ic_call -> makeCurrentFragment(callFragment)
                R.id.ic_chat -> makeCurrentFragment(chatFragment)
                else -> makeCurrentFragment(callFragment)
            }
            true
        }
    }

    override fun onBackPressed() {
        if(binding.btmNvg.selectedItemId == R.id.ic_call){
            super.onBackPressed()
            finish()
        }else{
            // 复用已有的callFragment实例,不要新建
            makeCurrentFragment(callFragment)
        }
    }

    private fun makeCurrentFragment(fragment: Fragment) =
       supportFragmentManager.beginTransaction().apply {
           replace(R.id.fl_wrapper , fragment)
           commit()
       }
}

修改完成后点击按钮即可正常跳转,不需要重做UI。


内容的提问来源于stack exchange,提问作者Raghav Sharma

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.15 11:36:10