android中NavigationView(Design Support)的使用

NavigationView可以实现美观的菜单功能展示,下面看一下怎么使用NavigationView

先是主Activity

activity_main.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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:orientation="vertical"
    tools:context=".MainActivity">

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="?attr/colorPrimary"
        android:minHeight="?attr/actionBarSize"
        android:theme="?attr/actionBarTheme" />

    <android.support.v4.widget.DrawerLayout
        android:id="@+id/drawer1"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <android.support.constraint.ConstraintLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent">

        </android.support.constraint.ConstraintLayout>

            <android.support.design.widget.NavigationView
                android:id="@+id/navMenu"
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:layout_gravity="start"
                app:headerLayout="@layout/main_header"
                app:menu="@menu/menu1">
            </android.support.design.widget.NavigationView>
    </android.support.v4.widget.DrawerLayout>


</LinearLayout>

这个布局是这样的:

最外层是一个上下结构的LinearLayout,从上到下依次是一个Toolbar、一个DrawerLayout

DrawerLayout包括一个ConstraintLayout主界面和一个NavigationView抽屉界面

NavigationView导航菜单包括一个头部,以及头部以下的菜单部分

 

然后需要添加NavigationView导航菜单的头部,以及菜单:

头部main_header.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ImageView
        android:id="@+id/imageView1"
        android:layout_width="150dp"
        android:layout_height="150dp"
        android:layout_weight="1"
        android:paddingTop="10dp"
        android:paddingBottom="10dp" />
</LinearLayout>

这个头部只有一个ImageView,我先不为这个ImageView指定图片资源,待会我动态指定资源,以便于将这个图片显示成圆形的

 

导航菜单menu1.xml:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:android="http://schemas.android.com/apk/res/android">

    <group android:checkableBehavior="single">
        <item
            android:id="@+id/editItem"
            android:icon="@android:drawable/ic_menu_edit"
            android:title="编辑"
            app:showAsAction="always" />
        <item
            android:id="@+id/helpItem"
            android:icon="@android:drawable/ic_menu_help"
            android:title="帮助"
            app:showAsAction="always" />
        <item
            android:id="@+id/deleteItem"
            android:icon="@android:drawable/ic_menu_delete"
            android:title="删除"
            app:showAsAction="always" />
    </group>
</menu>

这个菜单是有一个group菜单组,里面嵌套了三个item菜单项,注意group组有一个重要的属性android:checkableBehavior="single",这个一定要添加,不然到时候选中效果显示不出来。

 

最后就是主Activity的java类了

MainActivity.java:

 1 package com.example.chenrui.app1;
 2 
 3 import android.graphics.BitmapFactory;
 4 import android.support.annotation.NonNull;
 5 import android.support.design.widget.NavigationView;
 6 import android.support.v4.graphics.drawable.RoundedBitmapDrawable;
 7 import android.support.v4.graphics.drawable.RoundedBitmapDrawableFactory;
 8 import android.support.v4.widget.DrawerLayout;
 9 import android.support.v7.app.ActionBarDrawerToggle;
10 import android.support.v7.app.AppCompatActivity;
11 import android.os.Bundle;
12 import android.support.v7.widget.Toolbar;
13 import android.view.MenuItem;
14 import android.view.View;
15 import android.widget.ImageView;
16 
17 public class MainActivity extends AppCompatActivity {
18 
19     @Override
20     protected void onCreate(Bundle savedInstanceState) {
21         super.onCreate(savedInstanceState);
22         setContentView(R.layout.activity_main);
23 
24         Toolbar toolbar = findViewById(R.id.toolbar1);
25         setSupportActionBar(toolbar);
26         getSupportActionBar().setHomeButtonEnabled(true);
27         getSupportActionBar().setDisplayHomeAsUpEnabled(true);
28 
29         final DrawerLayout drawerLayout = findViewById(R.id.drawer1);
30         ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(this,drawerLayout,toolbar,R.string.open,R.string.close) {
31             @Override
32             public void onDrawerOpened(View drawerView) {
33                 super.onDrawerOpened(drawerView);
34             }
35 
36             @Override
37             public void onDrawerClosed(View drawerView) {
38                 super.onDrawerClosed(drawerView);
39             }
40         };
41         toggle.syncState();
42         drawerLayout.addDrawerListener(toggle);
43 
44         final NavigationView navMenu = findViewById(R.id.navMenu);
45         navMenu.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
46             @Override
47             public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) {
48                 menuItem.setChecked(true);
49                 drawerLayout.closeDrawers();
50                 return true;
51             }
52         });
53 
54         ImageView imageView = navMenu.getHeaderView(0).findViewById(R.id.imageView1);
55         RoundedBitmapDrawable bitmapDrawable = RoundedBitmapDrawableFactory.create(getResources(),BitmapFactory.decodeResource(getResources(),R.drawable.img01));
56         bitmapDrawable.setCircular(true);
57         imageView.setImageDrawable(bitmapDrawable);
58     }
59 }

第24到42行代码是指定Activity的菜单栏,并且为菜单栏添加切换抽屉界面显示或隐藏的按钮

第44到52行代码是响应NavigationView选择事件的,选择一个菜单项,会把对应菜单项置为选中状态,并且隐藏抽屉界面,这个里面还应该有菜单要执行的其他动作,我这里是示例,所以没有做别的操作

第54到57行代码是为NavigationView的头部图片动态指定一个图片资源,并且把图片改成圆角的,注意第54行代码查找图片的方式,因为图片位于NavigationView组件的headerLayout中,无法直接通过findViewById找到这个图片,需要先找到NavigationView组件头部的View,然后通过头部的View找到图片组件。这里是使用了RoundedBitmapDrawable来实现圆角图片的,用起来还是比较简单的。

 

最后看一下执行的效果:

 

posted @ 2019-01-22 10:54  魔豆  阅读(728)  评论(0编辑  收藏  举报