Android DrawerLayout和NavigationView 的使用方法


1、DrawerLayout

侧拉菜单作为常见的导航交互控件,最开始在没有没有android官方控件时,很多时候都是使用开源的SlidingMenu。使用DrawerLayout可以轻松的实现抽屉效果。DrawerLayout 在android.support.v4.widget.DrawerLayout这个包里。这里只说DrawerLayout最简单的实现,相当于hello world。

1.1、布局

DrawerLayout布局分两部分,第一用户内容,就是非菜单部分。第二是菜单。 [html]  view plain  copy
  1. <android.support.v4.widget.DrawerLayout   
  2.     xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     xmlns:tools="http://schemas.android.com/tools"  
  4.     android:layout_width="match_parent"  
  5.     android:layout_height="match_parent"  
  6.     android:id="@+id/drawer_layout"  
  7.     tools:context="com.example.mydraw3.MainActivity" >  
  8.       
  9.     <FrameLayout  
  10.         android:id="@+id/container"  
  11.         android:layout_width="wrap_content"  
  12.         android:layout_height="wrap_content"  
  13.          />  
  14.       
  15.     <ListView   
  16.         android:layout_width="240dp"  
  17.         android:layout_height="match_parent"  
  18.         android:id="@+id/lv_drawer"  
  19.         android:background="#fff0f0f0"  
  20.         android:layout_gravity="start"  
  21.         />  
  22. android.support.v4.widget.DrawerLayout>  

上面一个FramLayout,是用户内容去,下面一个View,是Drawer,这里用的ListView。

1.2、代码

因为是hello world,所以出去自动生成的,代码中并无太多内容。主要是从给ListView填充一个数组,对应Drawer 里的菜单项。 [java]  view plain  copy
  1. package com.example.mydraw3;  
  2.   
  3. import android.os.Bundle;  
  4. import android.support.v4.widget.DrawerLayout;  
  5. import android.support.v7.app.ActionBarActivity;  
  6. import android.view.Menu;  
  7. import android.view.MenuItem;  
  8. import android.view.View;  
  9. import android.widget.AdapterView;  
  10. import android.widget.AdapterView.OnItemClickListener;  
  11. import android.widget.AdapterView.OnItemSelectedListener;  
  12. import android.widget.ArrayAdapter;  
  13. import android.widget.ListView;  
  14. import android.widget.TextView;  
  15.   
  16. public class MainActivity extends ActionBarActivity {  
  17.   
  18.     private DrawerLayout mDrawerLayout;  
  19.     private ListView mLvDrawer;  
  20.     private String mTitle;  
  21.   
  22.     @Override  
  23.     protected void onCreate(Bundle savedInstanceState) {  
  24.         super.onCreate(savedInstanceState);  
  25.         setContentView(R.layout.activity_main);  
  26.   
  27.         initView();  
  28.         initDrawer();  
  29.         mDrawerLayout.openDrawer(mLvDrawer);  
  30.     }  
  31.   
  32.     private void initDrawer() {  
  33.         //数组定义在xml 文件中  
  34.         String[] items = getResources().getStringArray(R.array.navi_items);  
  35.         ArrayAdapter adapter = new ArrayAdapter(this,  
  36.                 android.R.layout.simple_expandable_list_item_1);  
  37.         //绑定到adapter,并设置给listview  
  38.         adapter.addAll(items);  
  39.         mLvDrawer.setAdapter(adapter);  
  40.         mLvDrawer.setSelection(0);  
  41.         //设置点击item事件  
  42.         mLvDrawer.setOnItemClickListener(new OnItemClickListener() {  
  43.   
  44.             @Override  
  45.             public void onItemClick(AdapterView<?> parent, View view,  
  46.                     int position, long id) {  
  47.                 mLvDrawer.setSelection(position);  
  48.             }  
  49.         });  
  50.         mLvDrawer.setOnItemSelectedListener(new OnItemSelectedListener() {  
  51.   
  52.             @Override  
  53.             public void onItemSelected(AdapterView<?> parent, View view,  
  54.                     int position, long id) {  
  55.                 mTitle = ((TextView) view).getText().toString();  
  56.                 setFragment();  
  57.                 mDrawerLayout.closeDrawer(mLvDrawer);  
  58.             }  
  59.   
  60.             @Override  
  61.             public void onNothingSelected(AdapterView<?> parent) {  
  62.                 // TODO Auto-generated method stub  
  63.                   
  64.             }  
  65.         });  
  66.     }  
  67.     //根据点击,生成一个对应Fragment  
  68.     private void setFragment() {  
  69.         getSupportFragmentManager().beginTransaction()  
  70.         .replace(R.id.container, new HolderFragment(mTitle))  
  71.         .commit();  
  72.         getSupportActionBar().setTitle(mTitle);  
  73.     }  
  74.   
  75.     private void initView() {  
  76.         mTitle = getResources().getString(R.string.app_name);  
  77.         mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);  
  78.         mLvDrawer = (ListView) findViewById(R.id.lv_drawer);  
  79.         mLvDrawer.setSelection(0);  
  80.     }  
  81.   
  82.     @Override  
  83.     public boolean onCreateOptionsMenu(Menu menu) {  
  84.         getMenuInflater().inflate(R.menu.main, menu);  
  85.         return true;  
  86.     }  
  87.   
  88.     @Override  
  89.     public boolean onOptionsItemSelected(MenuItem item) {  
  90.         int id = item.getItemId();  
  91.         if (id == R.id.action_settings) {  
  92.             return true;  
  93.         }  
  94.         return super.onOptionsItemSelected(item);  
  95.     }  
  96. }  

1.3、运行效果图

Android DrawerLayout和NavigationView 的使用方法_第1张图片 是不是很简单? 如果觉得菜单有些单调,可以配合NavigationView使用。实现更丰富的效果。

2、DrawerLayout+Navigation

NavigationView一把和DrawerLayout配合使用。还是上面的布局文件,将其第二部分,也就是实现Drawer的View的位置,换成NavigationView。NavigationView能实现更丰富的效果。

2.1、布局文件

[html]  view plain  copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <android.support.v4.widget.DrawerLayout 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:layout_width="match_parent"  
  6.     android:layout_height="match_parent"  
  7.     tools:openDrawer="start"  
  8.     >  
  9.   
  10.     <LinearLayout  
  11.         android:layout_width="wrap_content"  
  12.         android:layout_height="wrap_content"  
  13.         android:background="#E1BEE7"  
  14.         android:orientation="vertical">  
  15.   
  16.         <android.support.v7.widget.Toolbar  
  17.             android:id="@+id/id_toolbar"  
  18.             android:layout_width="match_parent"  
  19.             android:layout_height="?attr/actionBarSize"  
  20.             android:background="?attr/colorPrimary"  
  21.             app:layout_scrollFlags="scroll|enterAlways"  
  22.             app:logo="@mipmap/ic_launcher"  
  23.             app:popupTheme="@style/ThemeOverlay.AppCompat.Light"  
  24.             app:title="laxian" />  
  25.   
  26.         <TextView  
  27.             android:layout_width="match_parent"  
  28.             android:layout_height="wrap_content"  
  29.             android:text="hello navigation" />  
  30.     LinearLayout>  
  31.   
  32.     <android.support.design.widget.NavigationView  
  33.         android:id="@+id/navi"  
  34.         android:layout_width="240dp"  
  35.         android:layout_height="match_parent"  
  36.         android:background="#99b2b2b2"  
  37.         android:layout_gravity="start"  
  38.         app:headerLayout="@layout/header"  
  39.         app:menu="@menu/activity_main_drawer"  
  40.         />  
  41.   
  42. android.support.v4.widget.DrawerLayout>  

和第一部分一样,只是第二部分Drawer部分用NavigationView完成。NavigationView headerLayout 属性和menu属性,分别可以指定Header部分布局文件和menu部分@menu资源,实现各种自定义效果。 同样,也是因为是个hello world,展示效果的demo,NavigationView只需定义好布局文件就能实现我们需要的效果,至于点击事件的逻辑,不在粘贴。

2.2、效果图如下:

Android DrawerLayout和NavigationView 的使用方法_第2张图片

更多相关文章

  1. android下快速检索出媒体文件所在文件夹
  2. 带你了解Android约束布局ConstraintLayout
  3. Android 相机 预览 添加蒙板效果的实现
  4. 【Android开发学习08】SurfaceView显示动画效果

随机推荐

  1. 50款Android手机必备应用大全
  2. Android(安卓)API 中文 (15) ―― GridView
  3. android中监听软键盘的弹出与隐藏,并获取
  4. android NDK安装
  5. android 网络下载PDF文件并打开PDF文件内
  6. android实现wifi与移动数据的切换
  7. 【Android 周末回眸】2011.09.27-2011.10
  8. android广播发送与接收演示
  9. Android handler用法详解二(例1)
  10. Android Service的思考(4)