NavigationView打开后瞬间关闭问题求助
问题现象
打开NavigationView时会立即关闭,无法正常显示;双击打开仅短暂显示后再次关闭。
问题根源&解决方案
1. 主题冲突(核心原因)
如果Activity主题未设置为无ActionBar样式,系统默认ActionBar会与你自定义的Toolbar冲突,导致DrawerLayout的切换逻辑异常。
修复方式:在AndroidManifest.xml中为MainActivity指定NoActionBar主题:
<activity android:name=".MainActivity" android:theme="@style/Theme.MaterialComponents.Light.NoActionBar"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>
2. 完善汉堡菜单点击处理
需要手动处理ActionBarDrawerToggle的菜单点击事件,确保汉堡按钮能正确触发Drawer的开关。
修复方式:在MainActivity中添加以下方法:
override fun onOptionsItemSelected(item: MenuItem): Boolean { val toggle = ActionBarDrawerToggle( this, drawerLayout, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close ) return if (toggle.onOptionsItemSelected(item)) { true } else super.onOptionsItemSelected(item) }
3. 导航项选中后关闭Drawer
当前代码未在选中导航项后关闭Drawer,虽然不是打开即关闭的直接原因,但会导致交互逻辑不完整。
修复方式:修改setupNavigation方法:
private fun setupNavigation() { navigationView.setNavigationItemSelectedListener { when (it.itemId) { R.id.quickAlarm -> showQuickAlarmFragment() R.id.alarmList -> showAlarmListFragment() R.id.info -> showInfoFragment() } // 选中菜单项后关闭Drawer drawerLayout.closeDrawer(GravityCompat.START) true } }
4. 添加返回键关闭Drawer逻辑
补充返回键行为,提升交互完整性:
override fun onBackPressed() { if (drawerLayout.isDrawerOpen(GravityCompat.START)) { drawerLayout.closeDrawer(GravityCompat.START) } else { super.onBackPressed() } }
完整修正后的MainActivity代码
class MainActivity : AppCompatActivity() { private lateinit var drawerLayout: DrawerLayout private lateinit var navigationView: NavigationView private lateinit var toolbar: androidx.appcompat.widget.Toolbar override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) toolbar = findViewById(R.id.toolbar) drawerLayout = findViewById(R.id.drawerLayout) navigationView = findViewById(R.id.navigationView) setSupportActionBar(toolbar) val toggle = ActionBarDrawerToggle( this, drawerLayout, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close ) drawerLayout.addDrawerListener(toggle) toggle.syncState() setupNavigation() } private fun setupNavigation() { navigationView.setNavigationItemSelectedListener { when (it.itemId) { R.id.quickAlarm -> showQuickAlarmFragment() R.id.alarmList -> showAlarmListFragment() R.id.info -> showInfoFragment() } drawerLayout.closeDrawer(GravityCompat.START) true } } private fun showQuickAlarmFragment() { supportFragmentManager.beginTransaction() .replace(R.id.container, QuickAlarmFragment.newInstance()) .commit() } private fun showAlarmListFragment() { supportFragmentManager.beginTransaction() .replace(R.id.container, AlarmListFragment.newInstance()) .commit() } private fun showInfoFragment() { supportFragmentManager.beginTransaction() .replace(R.id.container, InfoFragment.newInstance()) .commit() } override fun onOptionsItemSelected(item: MenuItem): Boolean { val toggle = ActionBarDrawerToggle( this, drawerLayout, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close ) return if (toggle.onOptionsItemSelected(item)) { true } else super.onOptionsItemSelected(item) } override fun onBackPressed() { if (drawerLayout.isDrawerOpen(GravityCompat.START)) { drawerLayout.closeDrawer(GravityCompat.START) } else { super.onBackPressed() } } }
布局验证
你的activity_main.xml布局结构正确,确认NavigationView的layout_gravity="start"属性无误,无布局覆盖或层级冲突即可。
内容的提问来源于stack exchange,提问作者Güven Salgun
相关产品推荐
相关产品推荐

