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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 15:50:32