Android NavigationView是Android官方推出的一个UI布局控件,用于实现侧滑式导航菜单。通过NavigationView,我们可以轻松地实现一个优雅美观的侧滑菜单,而无需自己手动布局和渲染。
一、NavigationView的基本使用
要使用NavigationView,我们需要在xml布局文件中先定义一个DrawerLayout,然后将NavigationView作为其子控件。
<android.support.v4.widget.DrawerLayout android:id="@+id/drawer_layout" android:layout_width="match_parent" android:layout_height="match_parent"> <!--主内容区域--> <RelativeLayout android:id="@+id/main_content" android:layout_width="match_parent" android:layout_height="match_parent"> ... </RelativeLayout> <!--侧滑菜单区域--> <android.support.design.widget.NavigationView android:id="@+id/nav_view" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_gravity="start"> <!--菜单项--> <menu> <group android:checkableBehavior="single"> <item android:id="@+id/nav_menu1" android:title="菜单项1" /> <item android:id="@+id/nav_menu2" android:title="菜单项2" /> <item android:id="@+id/nav_menu3" android:title="菜单项3" /> </group> </menu> </android.support.design.widget.NavigationView> </android.support.v4.widget.DrawerLayout>
其中,DrawerLayout控件是整个布局的根控件,主要分为主内容区域和侧滑菜单区域两部分,并通过layout_gravity属性实现菜单区域在左侧滑出。NavigationView控件则是侧滑菜单的具体实现,可以添加自定义的菜单项或者分组,并且支持图标和文本的显示。
二、NavigationView的事件处理
当用户点击NavigationView中的某一菜单项时,我们可以通过设置NavigationItemSelectedListener来监听事件,并在相应的回调方法中做出处理。
NavigationView navigationView = findViewById(R.id.nav_view); navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() { @Override public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) { switch (menuItem.getItemId()) { case R.id.nav_menu1: //处理菜单项1的点击事件 break; case R.id.nav_menu2: //处理菜单项2的点击事件 break; case R.id.nav_menu3: //处理菜单项3的点击事件 break; } //关闭侧滑菜单 DrawerLayout drawerLayout = findViewById(R.id.drawer_layout); drawerLayout.closeDrawer(GravityCompat.START); return true; } });
在回调方法中,我们可以根据菜单项的id来区分不同的点击事件,并在相应的case中处理具体的逻辑。最后,我们需要手动关闭侧滑菜单。
三、NavigationView与Toolbar的结合
在实际开发中,我们通常会将Toolbar作为ActionBar来使用,并且想要在侧滑菜单中添加一个头部布局来显示用户的基本信息(如头像、用户名等)。这时,我们可以使用NavigationView提供的addHeaderView方法来实现。
NavigationView navigationView = findViewById(R.id.nav_view); //添加一个头部布局 View headerView = LayoutInflater.from(this).inflate(R.layout.nav_header, null); navigationView.addHeaderView(headerView); //设置头部布局中的控件(如头像、用户名等)的点击事件 headerView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //处理头部布局的点击事件 } }); //设置NavigationView中菜单项的点击事件 navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() { @Override public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) { ... return true; } }); //设置Toolbar为ActionBar setSupportActionBar(toolbar); ActionBar actionBar = getSupportActionBar(); if (actionBar != null) { actionBar.setDisplayHomeAsUpEnabled(true); actionBar.setHomeAsUpIndicator(R.drawable.ic_menu); }
通过addHeaderView方法,我们可以将一个自定义的布局文件添加到NavigationView中,并可以在回调方法中处理其控件的点击事件。而对于Toolbar,则需要通过setSupportActionBar方法将其设置为ActionBar,并在其左上角添加一个默认的菜单图标(即侧滑菜单按钮)。
四、NavigationView的高级使用
除了基本的使用方法外,NavigationView还提供了一些高级的用法,例如多级菜单、动态添加菜单项、添加自定义布局等。
1、多级菜单:可以通过添加子菜单来实现多级菜单的显示。
<menu> <group android:checkableBehavior="single"> <item android:id="@+id/nav_menu1" android:title="菜单项1" /> <item android:id="@+id/nav_menu2" android:title="菜单项2"> <!--子菜单1--> <menu> <item android:id="@+id/nav_sub_menu1" android:title="子菜单项1" /> <item android:id="@+id/nav_sub_menu2" android:title="子菜单项2" /> <item android:id="@+id/nav_sub_menu3" android:title="子菜单项3" /> </menu> </item> <item android:id="@+id/nav_menu3" android:title="菜单项3" /> </group> </menu>
2、动态添加菜单项:可以在代码中动态添加菜单项。
NavigationView navigationView = findViewById(R.id.nav_view); //添加一个单独的菜单项 Menu menu = navigationView.getMenu(); menu.add("单独的菜单项");
3、添加自定义布局:可以在NavigationView中添加自定义的布局文件。
NavigationView navigationView = findViewById(R.id.nav_view); //添加自定义的布局文件 View customView = LayoutInflater.from(this).inflate(R.layout.nav_custom_layout, null); navigationView.addView(customView);
通过上述高级用法,我们可以更加灵活地使用NavigationView,并满足更多的业务需求。