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. Android补间动画原理介绍
  2. Android 软键盘功能键(EditText)
  3. android R cannot be resolved to a vari
  4. Android(安卓)模拟机键盘不可用的问题 !!
  5. Android初次使用遇到的两个有关问题
  6. Android(安卓)TextView中文字通过Spannab
  7. Android的Camera系统结构
  8. Android 启动过程详解(学习1)
  9. Android之阴影制作(Shadow)
  10. Google 手机操作系统 Android(安卓)开发