Android导航抽屉可正常开关但菜单项不显示,求技术解决方案
问题描述
为App添加Navigation Drawer后,抽屉可正常开关,但无任何菜单项显示,相关代码如下:
主布局XML
<?xml version="1.0" encoding="utf-8"?> <androidx.drawerlayout.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/drawableLayout" tools:context=".MainActivity"> <androidx.appcompat.widget.Toolbar android:id="@+id/customToolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" /> <LinearLayout...> <!--This linear layout has all the elements of UI.--> <com.google.android.material.navigation.NavigationView android:id="@+id/navigationView" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_gravity="start" app:menu="@menu/navigation_items" android:backgroundTint="@color/purple_500" /> </androidx.drawerlayout.widget.DrawerLayout>
菜单项XML(res/menu/navigation_items.xml)
<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" tools:showIn="navigation_view"> <item android:id="@+id/homeMenu" android:title="Home" android:icon="@drawable/ic_home_menu_icon"/> <item android:id="@+id/signUpMenu" android:title="Sign Up" android:icon="@drawable/ic_signup" /> <item android:id="@+id/loginMenu" android:title="Login" android:icon="@drawable/ic_lock_open" /> </menu>
MainActivity代码
class MainActivity : AppCompatActivity(){ private var actionBarDrawerToggle: ActionBarDrawerToggle? = null override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) actionBarDrawerToggle = ActionBarDrawerToggle(this,drawableLayout,customToolbar,R.string.open,R.string.close) drawableLayout.addDrawerListener(actionBarDrawerToggle!!) actionBarDrawerToggle!!.syncState() setSupportActionBar(customToolbar) supportActionBar!!.title = "" supportActionBar!!.setDisplayHomeAsUpEnabled(true) navigationView.setNavigationItemSelectedListener{ when(it.itemId){ R.id.homeMenu -> Toast.makeText(this@MainActivity, "Home clicked", Toast.LENGTH_SHORT).show() R.id.signUpMenu -> Toast.makeText(this@MainActivity, "SignUP clicked", Toast.LENGTH_SHORT).show() R.id.loginMenu -> Toast.makeText(this@MainActivity, "Login clicked", Toast.LENGTH_SHORT).show() } true } } }
自定义Toolbar主题
<style name="Theme.CustomToolbarTheme" parent="Theme.MaterialComponents.DayNight.NoActionBar"> <item name="colorPrimary">@color/purple_500</item> <item name="colorPrimaryVariant">@color/purple_700</item> <item name="colorOnPrimary">@color/white</item> </style>
解决方案
以下是几个直接的排查和修复步骤:
修复主布局的层级与标签问题
主布局中LinearLayout未闭合,且它作为DrawerLayout的主内容区域,必须是第一个子View且布局完整,否则可能覆盖NavigationView。修正后的LinearLayout示例:<LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <!-- 你的UI元素 --> </LinearLayout>解决颜色冲突问题
NavigationView背景为@color/purple_500,如果菜单项文字、图标颜色与背景接近,会导致视觉上不可见。可直接在NavigationView中显式设置颜色:<com.google.android.material.navigation.NavigationView ... app:itemTextColor="@color/white" app:itemIconTint="@color/white" />也可在主题中统一配置:
<style name="Theme.CustomToolbarTheme" parent="Theme.MaterialComponents.DayNight.NoActionBar"> ... <item name="android:textColorPrimary">@color/white</item> <item name="colorOnSurface">@color/white</item> </style>验证menu文件的正确性
确认navigation_items.xml放在res/menu/目录下,文件名、路径无拼写错误(区分大小写)。检查Material Components依赖
确保Module级别的build.gradle中添加了Material Components库依赖:implementation 'com.google.android.material:material:1.9.0' // 可替换为最新版本调整ActionBarDrawerToggle初始化顺序
先设置Toolbar为ActionBar,再初始化DrawerToggle,避免顺序异常:override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) // 先配置Toolbar setSupportActionBar(customToolbar) supportActionBar?.title = "" supportActionBar?.setDisplayHomeAsUpEnabled(true) // 再初始化DrawerToggle actionBarDrawerToggle = ActionBarDrawerToggle(this, drawableLayout, customToolbar, R.string.open, R.string.close) drawableLayout.addDrawerListener(actionBarDrawerToggle!!) actionBarDrawerToggle!!.syncState() // 其余代码... }
内容的提问来源于stack exchange,提问作者Akash Verma
相关产品推荐
相关产品推荐

