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

