android新特性:DrawerLayout与NavigationView配合使用(侧滑效果)

首先看一下效果吧


20170120150737931.png


Android Design Support Library中增加了 NavigationView与DrawerLayout这个控件。代替SlidingMenu项目中的使用!

在这里让我们来学习一下DrawerLayout和NavigationView的使用吧!

在工程中添加依赖:

 compile 'com.android.support:design:25.0.0'

在Material Design中,NavigationView导航与DrawerLayout抽屉,被设计用于应用导航,提供了一种通用的导航方式,体现了设计的一致性。

NavigationView是一个导航菜单框架,使用menu资源填充数据,使我们可以更简单高效的实现导航菜单。

在XML中使用DrawerLayout与NavigationView进行布局

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:app = "http://schemas.android.com/apk/res-auto"
  4. xmlns:tools = "http://schemas.android.com/tools"
  5. android:id = "@+id/activity_main"
  6. android:layout_width = "match_parent"
  7. android:layout_height = "match_parent"
  8. tools:context = "cn.hnshangyu.navigationview.MainActivity" >
  9. <android.support.v4.widget.DrawerLayout
  10. android:id = "@+id/drawer_layout"
  11. android:layout_width = "match_parent"
  12. android:layout_height = "match_parent" >
  13. <!--主页面-->
  14. <FrameLayout
  15. android:id = "@+id/fl_main"
  16. android:background = "@color/colorAccent"
  17. android:layout_width = "match_parent"
  18. android:layout_height = "match_parent" />
  19. <!--侧滑页-->
  20. <android.support.design.widget.NavigationView
  21. android:id = "@+id/navigation"
  22. android:layout_width = "320dp"
  23. android:layout_height = "match_parent"
  24. android:layout_gravity = "start"
  25. app:headerLayout = "@layout/drawer_header"
  26. app:menu = "@menu/drawer" />
  27. </android.support.v4.widget.DrawerLayout>
  28. </RelativeLayout>

注意其中NavigationView的两个自定义属性
app:headerLayout接收一个layout,作为导航菜单顶部的Header,即效果图中的侧滑页图片部分,开发中设置则有,不设置则无。
app:menu接收一个menu,作为导航菜单的菜单项,几乎是必选项,不然这个控件就失去意义了。但也可以在运行时动态改变menu属性。

用于NavigationView的典型menu文件,应该是一个可选中菜单项的集合。其中checked=”true”的item将会高亮显示,这可以确保用户知道当前选中的菜单项是哪个。

侧滑页头布局drawer_header中的布局

  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 = "match_parent" >
  5. <ImageView
  6. android:layout_width = "match_parent"
  7. android:layout_height = "match_parent"
  8. android:src = "@mipmap/ic_recyclerview_09" />
  9. </RelativeLayout>

在这里只设置了一张图片,在这里其实有个疑惑,也是注意的地方,就是头布局在Activity中怎么得到并设置点击事件等操作呢?稍后看代码!

menu/drawer的布局

  1. <?xml version = "1.0" encoding= "utf-8" ?>
  2. <menu xmlns:android= "http://schemas.android.com/apk/res/android"
  3. xmlns:tools= "http://schemas.android.com/tools"
  4. tools:context= ".MainActivity" >
  5. <group android:checkableBehavior= "single" >
  6. < item
  7. android: id = "@+id/navigation_item_one"
  8. android:icon= "@mipmap/wsxx"
  9. android:title= "huangixoaguo" />
  10. < item
  11. android: id = "@+id/navigation_item_two"
  12. android:icon= "@mipmap/wddd"
  13. android:title= "目录" />
  14. < item
  15. android: id = "@+id/navigation_item_three"
  16. android:icon= "@mipmap/wdyd"
  17. android:title= "佳佳" />
  18. < item
  19. android: id = "@+id/navigation_item_four"
  20. android:icon= "@mipmap/wdyy"
  21. android:title= "闹钟" />
  22. < item
  23. android: id = "@+id/navigation_item_five"
  24. android:icon= "@mipmap/sz"
  25. android:title= "设置" />
  26. < item
  27. android: id = "@+id/navigation_subheader_one"
  28. android:icon= "@mipmap/sz"
  29. android:title= "子条目" >
  30. <menu>
  31. < item
  32. android: id = "@+id/navigation_sub_item_one"
  33. android:icon= "@mipmap/wdyd"
  34. android:title= "佳佳" />
  35. < item
  36. android: id = "@+id/navigation_sub_item_two"
  37. android:icon= "@mipmap/wdyy"
  38. android:title= "闹钟" />
  39. </menu>
  40. </ item >
  41. < item
  42. android: id = "@+id/navigation_subheader_two"
  43. android:icon= "@mipmap/sz"
  44. android:title= "子条目" >
  45. <menu>
  46. < item
  47. android: id = "@+id/navigation_sub_item_four"
  48. android:icon= "@mipmap/wdyd"
  49. android:title= "佳佳" />
  50. < item
  51. android: id = "@+id/navigation_sub_item_five"
  52. android:icon= "@mipmap/wdyy"
  53. android:title= "闹钟" />
  54. </menu>
  55. </ item >
  56. < item
  57. android: id = "@+id/navigation_subheader_three"
  58. android:icon= "@mipmap/sz"
  59. android:title= "子条目" >
  60. <menu>
  61. < item
  62. android: id = "@+id/navigation_sub_item_six"
  63. android:icon= "@mipmap/wdyd"
  64. android:title= "佳佳" />
  65. < item
  66. android: id = "@+id/navigation_sub_item_seven"
  67. android:icon= "@mipmap/wdyy"
  68. android:title= "闹钟" />
  69. </menu>
  70. </ item >
  71. < item
  72. android: id = "@+id/navigation_subheader_four"
  73. android:icon= "@mipmap/sz"
  74. android:title= "子条目" >
  75. <menu>
  76. < item
  77. android: id = "@+id/navigation_sub_item_eight"
  78. android:icon= "@mipmap/wdyd"
  79. android:title= "佳佳" />
  80. < item
  81. android: id = "@+id/navigation_sub_item_nine"
  82. android:icon= "@mipmap/wdyy"
  83. android:title= "闹钟" />
  84. </menu>
  85. </ item >
  86. </group>
  87. </menu>

里面使用menu的嵌套,来显示分组子标题!

Activity中的操作

  1. package cn.hnshangyu.navigationview;
  2. import android.os.Bundle;
  3. import android.support.annotation.NonNull;
  4. import android.support.design.widget.NavigationView;
  5. import android.support.v4.widget.DrawerLayout;
  6. import android.support.v7.app.AppCompatActivity;
  7. import android.view.MenuItem;
  8. import android.view.View;
  9. import android.widget.FrameLayout;
  10. import android.widget.ImageView;
  11. import android.widget.RelativeLayout;
  12. import butterknife.Bind;
  13. import butterknife.ButterKnife;
  14. import cn.hnshangyu.navigationview.utils.UIUtils;
  15. public class MainActivity extends AppCompatActivity {
  16. @Bind(R.id.fl_main)
  17. FrameLayout flMain;
  18. @Bind(R.id.navigation)
  19. NavigationView mNavigationView;
  20. @Bind(R.id.drawer_layout)
  21. DrawerLayout mDrawerLayout;
  22. private RelativeLayout headerView;
  23. @Override
  24. protected void onCreate(Bundle savedInstanceState) {
  25. super.onCreate(savedInstanceState);
  26. setContentView(R.layout.activity_main);
  27. ButterKnife.bind( this);
  28. //得到头布局
  29. headerView = (RelativeLayout) mNavigationView.getHeaderView( 0);
  30. initListener();
  31. }
  32. private MenuItem lastItem;
  33. private void initListener() {
  34. mNavigationView.setNavigationItemSelectedListener( new NavigationView.OnNavigationItemSelectedListener() {
  35. @Override
  36. public boolean onNavigationItemSelected( @NonNull MenuItem item) {
  37. switch (item.getItemId()) {
  38. case R.id. navigation_item_one:
  39. break;
  40. case R.id. navigation_item_two:
  41. break;
  42. case R.id. navigation_item_three:
  43. break;
  44. case R.id. navigation_item_four:
  45. break;
  46. case R.id. navigation_sub_item_one:
  47. break;
  48. case R.id. navigation_sub_item_two:
  49. break;
  50. case R.id. navigation_sub_item_four:
  51. break;
  52. case R.id. navigation_sub_item_five:
  53. break;
  54. case R.id. navigation_sub_item_six:
  55. break;
  56. case R.id. navigation_sub_item_seven:
  57. break;
  58. case R.id. navigation_sub_item_eight:
  59. break;
  60. case R.id. navigation_sub_item_nine:
  61. break;
  62. case R.id. navigation_item_five:
  63. break;
  64. }
  65. if (lastItem != null) {
  66. lastItem.setChecked( false);
  67. }
  68. item.setChecked( true);
  69. lastItem = item;
  70. UIUtils.showToast(item.getTitle().toString());
  71. mDrawerLayout.closeDrawers();
  72. return false;
  73. }
  74. });
  75. headerView.setOnClickListener( new View.OnClickListener() {
  76. @Override
  77. public void onClick(View view) {
  78. UIUtils.showToast( "头像");
  79. mDrawerLayout.closeDrawers();
  80. }
  81. });
  82. }
  83. }

用setNavigationItemSelectedListener方法来设置当导航项被点击时的回调。OnNavigationItemSelectedListener会提供给我们被选中的MenuItem,这与Activity的onOptionsItemSelected非常类似。通过这个回调方法,我们可以处理点击事件,改变item的选中状态,更新页面内容,关闭导航菜单,以及任何我们需要的操作。

其中的到headview的方法在这里我使用的是: navigationView.getHeaderView(0)的方式,如果子view较多

  1. headerView = navigationView.getHeaderView(0);
  2. headImg = (ImageButton)headerView.findViewById(R.id.user_head_img);
  3. userName = (TextView) headerView.findViewById(R.id.user_name);
  4. userDescription = (TextView) headerView.findViewById(R.id.user_description);

这种方式可以得到子view。

或:

  1. 先在Activity中声明NavigationView,然后再通过 View view = NavigationView.inflateHeaderView( int LayoutResID)这个方法导入头部布局文件,
  2. 这就意味着在NavigationView中不会静态去设置app: header属性,并且获取了头部的 View,这样就可以通过 View.findId...()方法来定位和监听了。

好了,差不多到这里基本的使用方法就实现了!有不好的地方,欢迎大家指出….谢谢!!!

Demo下载:http://download.csdn.net/detail/huangxiaoguo1/9742204

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值