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
相关产品推荐
相关产品推荐

