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

Android侧滑抽屉点击后Fragment不显示,mSelectedItem存随机值问题

问题原因
  1. 未绑定Toolbar到系统ActionBar:代码中直接使用supportActionBar但没有将布局内的Toolbar设置为当前Activity的ActionBar,导致supportActionBar为空,相关抽屉控制逻辑全部失效。
  2. DrawerToggle未完成绑定:仅实例化了ActionBarDrawerToggle对象,没有将其添加为DrawerLayout的监听器,也未调用syncState()同步状态,onDrawerClosed回调永远不会被触发,Fragment替换逻辑完全不会执行,自然看不到页面切换效果。
  3. 变量作用域问题:如果mSelectedItem没有声明为Activity的全局成员变量,仅为onCreate内的局部变量,闭包内访问时会拿到不可预期的随机值,甚至触发空异常。
  4. 分支覆盖不全:when语句仅处理了设置页一种情况,点击其他菜单项时newFragment处于未初始化状态,直接触发崩溃导致逻辑中断。
  5. 布局参数不合理:NavigationView的宽度设为match_parent会导致抽屉占满全屏,高度wrap_content会在菜单项过多时显示不全,也会引发部分交互异常。
修复方案
    1. 绑定Toolbar到ActionBar,在setContentView之后添加如下代码:
val toolbar = findViewById<Toolbar>(R.id.toolbar)
setSupportActionBar(toolbar)
// 现在supportActionBar才不为空
supportActionBar?.setDisplayHomeAsUpEnabled(true)
    1. 完成DrawerToggle的绑定配置,实例化Toggle之后追加绑定逻辑:
drawerLayout.addDrawerListener(mDrawerToggle)
mDrawerToggle.syncState()

同时重写Activity的onOptionsItemSelected方法,让Toggle响应Toolbar左上角的点击事件:

override fun onOptionsItemSelected(item: MenuItem): Boolean {
    if (mDrawerToggle.onOptionsItemSelected(item)) {
        return true
    }
    return super.onOptionsItemSelected(item)
}
    1. 确保mSelectedItem为Activity全局成员变量,声明时赋初始值:
// 在Activity类内、onCreate方法外声明
private var mSelectedItem: Int = 0
    1. 补全when分支的所有菜单项处理,新增兜底分支避免未初始化异常:
when(mSelectedItem) {
    R.id.nav_login -> {
        newFragment = LoginFragment()
        supportActionBar?.title = "登录"
    }
    R.id.nav_game -> {
        newFragment = GameFragment()
        supportActionBar?.title = "游戏"
    }
    R.id.nav_score -> {
        newFragment = ScoreFragment()
        supportActionBar?.title = "得分"
    }
    R.id.nav_settings -> {
        newFragment = SettingsFragment()
        supportActionBar?.title = "偏好设置"
    }
    R.id.nav_about -> {
        newFragment = AboutFragment()
        supportActionBar?.title = "关于"
    }
    R.id.nav_help -> {
        newFragment = HelpFragment()
        supportActionBar?.title = "帮助"
    }
    R.id.nav_videos -> {
        newFragment = VideoFragment()
        supportActionBar?.title = "视频"
    }
    else -> {
        newFragment = SettingsFragment()
        supportActionBar?.title = "偏好设置"
    }
}
    1. 修正NavigationView的布局参数:
<com.google.android.material.navigation.NavigationView
    android:id="@+id/nav_view"
    android:layout_width="280dp"
    android:layout_height="match_parent"
    android:layout_gravity="left"
    app:menu="@menu/main_mmm"/>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 23:24:04