当前位置:   article > 正文

Android NavigationView使用详解

android navigationview

何为NavigationView,比如QQ的侧滑菜单就是,给个图片就是下图,分为head和menu上下两部分


1、导入包:

//Design support库

implementation 'com.android.support:design:27.1.1'   

//实现图片圆形化

compile 'de.hdodenhof:circleimageview:2.1.0'

2.首先实现menu,如下:

checkableBehavior="single"             表示菜单为单选

icon="@drawable/nav_menu_call"    菜单图标

android:title="Call"                           菜单文字

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <menu xmlns:android="http://schemas.android.com/apk/res/android">
  3. <group android:checkableBehavior="single">
  4. <item
  5. android:id="@+id/nav_menu_call"
  6. android:icon="@drawable/nav_menu_call"
  7. android:title="Call" />
  8. <item
  9. android:id="@+id/nav_menu_friends"
  10. android:icon="@drawable/nav_menu_friends"
  11. android:title="Friends"/>
  12. <item
  13. android:id="@+id/nav_menu_loaction"
  14. android:icon="@drawable/nav_menu_loaction"
  15. android:title="Loaction"/>
  16. <item
  17. android:id="@+id/nav_menu_mail"
  18. android:icon="@drawable/nav_menu_mail"
  19. android:title="Mail"/>
  20. <item
  21. android:id="@+id/nav_menu_cloud"
  22. android:icon="@drawable/nav_menu_cloud"
  23. android:title="Cloud"/>
  24. </group>
  25. </menu>

2.实现head

180dp是一个比较适中的高度

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="match_parent"
  4. android:layout_height="180dp"
  5. android:background="@mipmap/head_backgroud">
  6. <de.hdodenhof.circleimageview.CircleImageView
  7. android:id="@+id/nav_cirI_head"
  8. android:layout_width="70dp"
  9. android:layout_height="70dp"
  10. android:src="@mipmap/head"
  11. android:layout_centerInParent="true"/>
  12. <TextView
  13. android:id="@+id/nav_tv_mail"
  14. android:layout_width="wrap_content"
  15. android:layout_height="wrap_content"
  16. android:text="1634475153@qq.com"
  17. android:layout_alignParentBottom="true"
  18. android:textColor="@color/white"
  19. android:textSize="14dp"/>
  20. <TextView
  21. android:id="@+id/nav_tv_username"
  22. android:layout_width="wrap_content"
  23. android:layout_height="wrap_content"
  24. android:text="LiangLiang"
  25. android:layout_above="@id/nav_tv_mail"
  26. android:textColor="@color/white"
  27. android:textSize="14dp"/>
  28. </RelativeLayout>

3.修改主界面布局:

theme="@style/Base.ThemeOverlay.AppCompat.Dark.ActionBar"        指定深色toolbar

popupTheme="@style/AlertDialog.AppCompat.Light"                          指定菜单是淡色

layout_gravity="start"                                                                            左面滑出菜单

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <android.support.v4.widget.DrawerLayout
  3. xmlns:android="http://schemas.android.com/apk/res/android"
  4. xmlns:app="http://schemas.android.com/apk/res-auto"
  5. android:layout_width="match_parent"
  6. android:layout_height="match_parent"
  7. android:id="@+id/design_drawer_layout">
  8. <FrameLayout
  9. android:layout_width="match_parent"
  10. android:layout_height="match_parent">
  11. <android.support.v7.widget.Toolbar
  12. android:id="@+id/design_tb_toolbar"
  13. android:layout_width="match_parent"
  14. android:layout_height="55dp"
  15. android:background="@color/colorPrimary"
  16. app:title="Design"
  17. android:theme="@style/Base.ThemeOverlay.AppCompat.Dark.ActionBar"
  18. app:popupTheme="@style/AlertDialog.AppCompat.Light">
  19. </android.support.v7.widget.Toolbar>
  20. </FrameLayout>
  21. <android.support.design.widget.NavigationView
  22. android:id="@+id/design_nav_view"
  23. android:layout_width="match_parent"
  24. android:layout_height="match_parent"
  25. android:layout_gravity="start"
  26. app:menu="@menu/nav_menu"
  27. app:headerLayout="@layout/nav_heder_layout"
  28. android:background="@mipmap/nav_menu_background">
  29. </android.support.design.widget.NavigationView>
  30. </android.support.v4.widget.DrawerLayout>

4.活动部分设置

实例化NavigationView

NavigationView navView = (NavigationView) findViewById(R.id.design_nav_view);

设置图片显示自身颜色,否则默认为灰色


在布局文件中添加app:itemIconTint="@color/blue"属性,表示设置图片的颜色全都为蓝色


显示图片原本颜色:

//让图片就是显示他本身的颜色

navView.setItemIconTintList(null);

还有下面两个常用的API:

app:itemBackground="@color/colorAccent"        设置每一个item的背景颜色

app:itemTextColor=""                                            设置item的背景颜色

NavigationView的item之间添加上一条分隔线:只需要在menu中将相应的item放到一个group中,并给该group取一个id即可,代码如下:

  1. <group android:id="@+id/group2">
  2. <item
  3. android:id="@+id/nav_menu_mail"
  4. android:icon="@drawable/nav_menu_mail"
  5. android:title="Mail"/>
  6. <item
  7. android:id="@+id/nav_menu_cloud"
  8. android:icon="@drawable/nav_menu_cloud"
  9. android:title="Cloud"/>
  10. </group>

此时效果如下:


5.头部点击事件

直接通过findViewById实例化设置onClick会崩溃,比较好的方式是通过getHeaderView获取头布局文件

5.1  getHeaderView获取头布局文件方式

//获取头布局文件

View headerView = navView.getHeaderView(0);

 然后实例化控件,设置点击事件就行

  1. cirIViewHead = (CircleImageView) headerView.findViewById(R.id.nav_cirI_head);
  2. cirIViewHead.setOnClickListener(new View.OnClickListener() {
  3. @Override
  4. public void onClick(View view) {
  5. Toast.makeText(DesignActivity.this,"Head",Toast.LENGTH_SHORT).show();
  6. }
  7. });
5.2  将XML里的静态引入删除:
  1. <android.support.design.widget.NavigationView
  2. android:id="@+id/nav_view"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. android:layout_gravity="start" />
  6. <!--删除下面两行-->
  7. <!--app:headerLayout="@layout/nav_header"-->
  8. <!--app:menu="@menu/nav_menu"-->
在代码里 findViewById 找到 NavigationView,然后引入 Header 和 Menu,再获取头部布局,最后设置监听事件:
  1. //findviewbyid
  2. navigationView = (NavigationView) findViewById(R.id.nav_view);
  3. //引入header和menu
  4. navigationView.inflateHeaderView(R.layout.nav_header);
  5. navigationView.inflateMenu(R.menu.nav_menu);
  6. //获取头部布局
  7. View navHeaderView = navigationView.getHeaderView(0);
  1. cirIViewHead = (CircleImageView) headerView.findViewById(R.id.nav_cirI_head);
  2. cirIViewHead.setOnClickListener(new View.OnClickListener() {
  3. @Override
  4. public void onClick(View view) {
  5. Toast.makeText(DesignActivity.this,"Head",Toast.LENGTH_SHORT).show();
  6. }
  7. });

6.菜单点击事件

  1. //菜单事件
  2. navView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
  3. @Override
  4. public boolean onNavigationItemSelected(@NonNull MenuItem item) {
  5. switch (item.getItemId()){
  6. case R.id.nav_menu_call:
  7. Toast.makeText(DesignActivity.this,"Call",Toast.LENGTH_SHORT).show();
  8. break;
  9. case R.id.nav_menu_friends:
  10. Toast.makeText(DesignActivity.this,"Friends",Toast.LENGTH_SHORT).show();
  11. break;
  12. case R.id.nav_menu_loaction:
  13. Toast.makeText(DesignActivity.this,"Loaction",Toast.LENGTH_SHORT).show();
  14. break;
  15. case R.id.nav_menu_mail:
  16. Toast.makeText(DesignActivity.this,"Mail",Toast.LENGTH_SHORT).show();
  17. break;
  18. case R.id.nav_menu_cloud:
  19. Toast.makeText(DesignActivity.this,"Cloud",Toast.LENGTH_SHORT).show();
  20. break;
  21. default:
  22. //关闭滑动菜单
  23. mDrawerLayout.closeDrawers();
  24. }
  25. //选中此项
  26. //item.setCheckable(true);
  27. return false;
  28. }
  29. });


声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/219271
推荐阅读
相关标签
  

闽ICP备14008679号