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

点击SignOut未跳转至SignInActivity,仍留原Fragment的原因排查

登出按钮点击后无法跳转页面的问题分析与解决

可能原因

  • Toolbar菜单事件未关联到Fragment回调
    在MyAccountFragment的onCreateView中,你同时执行了两种菜单初始化逻辑:给toolbar直接调用toolbar.inflateMenu()加载菜单,又重写了Fragment的onCreateOptionsMenu方法。这种重复操作会导致SignOut按钮的点击事件无法触发Fragment的onOptionsItemSelected——toolbar自身的菜单点击默认不会传递给Fragment的回调接口,两种逻辑冲突最终造成事件丢失。

  • Fragment与Activity状态不一致
    如果Fragment已和Activity解除关联(比如页面被后台回收后重建),activity对象可能为空,此时startActivity(intent)和activity?.finish()都不会执行,导致跳转失败。

解决方法

方案一:统一使用Fragment的菜单回调机制

修改MyAccountFragment的onCreateView,去掉toolbar直接加载菜单的代码,将toolbar绑定到Activity的ActionBar,让菜单事件自动传递到Fragment的回调:

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
    val view = inflater.inflate(R.layout.fragment_my_account, container, false)
    setHasOptionsMenu(true)
    
    val toolbar: Toolbar = view.findViewById(R.id.my_account_toolbar)
    // 将toolbar绑定到Activity的ActionBar,确保菜单事件能传递到Fragment
    (activity as AppCompatActivity).setSupportActionBar(toolbar)
    
    return view
}

保留原有的onCreateOptionsMenu和onOptionsItemSelected方法即可。

方案二:直接给Toolbar设置点击监听器

放弃Fragment的菜单回调,直接给toolbar设置OnMenuItemClickListener处理SignOut事件:

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
    val view = inflater.inflate(R.layout.fragment_my_account, container, false)
    
    val toolbar: Toolbar = view.findViewById(R.id.my_account_toolbar)
    toolbar.inflateMenu(R.menu.my_account_fragment_menu)
    
    // 直接给toolbar设置菜单点击监听
    toolbar.setOnMenuItemClickListener { item ->
        if (item.itemId == R.id.SignOut) {
            auth.signOut()
            activity?.let {
                val intent = Intent(it, SignInActivity::class.java)
                intent.flags = Intent.FLAG_ACTIVITY_CLEAR_TASK or Intent.FLAG_ACTIVITY_NEW_TASK
                startActivity(intent)
                it.finish()
            }
            return@setOnMenuItemClickListener true
        }
        false
    }
    
    return view
}

此时可以删除Fragment中onCreateOptionsMenu和onOptionsItemSelected的重写代码,避免逻辑冲突。

额外优化点

检查HomePageActivity的Fragment初始化逻辑:

// 原代码:创建新的HomeFragment实例,而非使用成员变量
supportFragmentManager.beginTransaction().replace(R.id.container, HomeFragment()).commit()
// 修改为:使用已声明的成员变量homeFragment
supportFragmentManager.beginTransaction().replace(R.id.container, homeFragment).commit()

这避免了切换回首页时重复创建Fragment实例,虽与当前跳转问题无关,但能提升页面稳定性。

内容的提问来源于stack exchange,提问作者Muhammet Konukcu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 20:45:40