Android 抽屉效果的导航菜单实现

抽屉效果的导航菜单

看了很多应用,觉得这种侧滑的抽屉效果的菜单很好。

不用切换到另一个页面,也不用去按菜单的硬件按钮,直接在界面上一个按钮点击,菜单就滑出来,而且感觉能放很多东西。

关于实现,搜索了一下,有如下两种:

1.用SlidingDrawer:

但是不知道为什么这个类官方不建议再继续用了:

Deprecated since API level 17

2.用DrawerLayout:

Guide在这里:

库的引用

首先,Support Library里的,需要加上android-support-v4.jar这个包。

然后程序中用时在前面导入import android.support.v4.widget.DrawerLayout;

如果找不到这个类,首先用SDK Manager更新一下Android Support Library,然后在Android SDK\extras\android\support\v4路径下找到android-support-v4.jar,复制到项目的libs路径,将其Add to Build Path.

代码1

布局:

<

RelativeLayout

xmlns:android

="http://schemas.android.com/apk/res/android"

xmlns:tools

="http://schemas.android.com/tools"

android:layout_width

="match_parent"

android:layout_height

="match_parent"

>

<

android.support.v4.widget.DrawerLayout

xmlns:android

="http://schemas.android.com/apk/res/android"

android:id

="@+id/drawer_layout"

android:layout_width

="match_parent"

android:layout_height

="match_parent"

>

<

FrameLayout

android:id

="@+id/content_frame"

android:layout_width

="match_parent"

android:layout_height

="match_parent"

/>

<

ListView

android:id

="@+id/left_drawer"

android:layout_width

="240dp"

android:layout_height

="match_parent"

android:layout_gravity

="left"

android:background

="#111"

android:choiceMode

="singleChoice"

android:divider

="@android:color/transparent"

android:dividerHeight

="0dp"

/>

android.support.v4.widget.DrawerLayout

>

DrawerLayout的第一个子元素是主要内容,即抽屉没有打开时显示的布局。这里采用了一个FrameLayout,里面什么也没放。

DrawerLayout的第二个子元素是抽屉中的内容,即抽屉布局,这里采用了一个ListView。

主要的Activity(从官方实例中扒出来的):

package

com.example.hellodrawer;

import android.os.Bundle;

import

android.app.Activity;

import

android.content.res.Configuration;

import

android.view.MenuItem;

import

android.view.View;

import

android.widget.AdapterView;

import

android.widget.AdapterView.OnItemClickListener;

import

android.widget.ArrayAdapter;

import

android.widget.ListView;

import

android.support.v4.app.ActionBarDrawerToggle;

import

android.support.v4.view.GravityCompat;

import

android.support.v4.widget.DrawerLayout;

public class HelloDrawerActivity extends Activity

private

String[] mPlanetTitles;{

private DrawerLayout mDrawerLayout;

private

ActionBarDrawerToggle mDrawerToggle;

private

ListView mDrawerList;

@Override

public

void

onCreate(Bundle savedInstanceState) {

super

.onCreate(savedInstanceState);

setContentView(R.layout.activity_hello_drawer);

mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);

//

init the ListView and Adapter, nothing new

initListView();

//

set a custom shadow that overlays the main content when the drawer

//

opens

mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START);

mDrawerToggle =

new

ActionBarDrawerToggle(

this

, mDrawerLayout,

R.drawable.ic_drawer, R.string.drawer_open, R.string.drawer_close)

{

/**

Called when a drawer has settled in a completely closed state.

*/

public

void

onDrawerClosed(View view) {

invalidateOptionsMenu();

//

creates call to

//

onPrepareOptionsMenu()

}

/**

Called when a drawer has settled in a completely open state.

*/

public

void

onDrawerOpened(View drawerView) {

invalidateOptionsMenu();

//

creates call to

//

onPrepareOptionsMenu()

} };

//

Set the drawer toggle as the DrawerListener

mDrawerLayout.setDrawerListener(mDrawerToggle);

//

enable ActionBar app icon to behave as action to toggle nav drawer

getActionBar().setDisplayHomeAsUpEnabled(

true

);

//

getActionBar().setHomeButtonEnabled(true);

//

Note: getActionBar() Added in API level 11

}

private

void

initListView() {

mDrawerList = (ListView) findViewById(R.id.left_drawer);

mPlanetTitles = getResources().getStringArray(R.array.planets_array);

//

Set the adapter for the list view

mDrawerList.setAdapter(

new

ArrayAdapter(

this

,

R.layout.list_item, mPlanetTitles));

//

Set the list's click listener

mDrawerList.setOnItemClickListener(

new

OnItemClickListener() {

public

void

onItemClick(AdapterView> parent, View view, @Override

int position, long id)

{

//

Highlight the selected item, update the title, and close the

//

drawer

mDrawerList.setItemChecked(position,

true

);

setTitle(mPlanetTitles[position]);

mDrawerLayout.closeDrawer(mDrawerList); }

});

}

@Override

protected

void

onPostCreate(Bundle savedInstanceState) {

super

.onPostCreate(savedInstanceState);

//

Sync the toggle state after onRestoreInstanceState has occurred.

mDrawerToggle.syncState(); }

@Override

public

void

onConfigurationChanged(Configuration newConfig) {

super

.onConfigurationChanged(newConfig);

mDrawerToggle.onConfigurationChanged(newConfig); }

@Override

public

boolean

onOptionsItemSelected(MenuItem item) {

//

Pass the event to ActionBarDrawerToggle, if it returns

//

true, then it has handled the app icon touch event

if

(mDrawerToggle.onOptionsItemSelected(item)) {

return

true

;

}

//

Handle your other action bar items...

return

super

.onOptionsItemSelected(item); }

}

比较纠结的是用了Level 11的一个API,这样minSdkVersion就有限制,不能太低。

图片资源Android官网示例处提供下载了。

程序运行后效果如下:

抽屉打开前:

抽屉打开后:

代码2

今天又看了一下DrawerLayout的类,发现有很多方法可以直接用的。

重新试了一下,其实不用上面那么麻烦,随便自己定义一个按钮控制抽屉的打开就行:

布局:

<

RelativeLayout

xmlns:android

="http://schemas.android.com/apk/res/android"

xmlns:tools

="http://schemas.android.com/tools"

android:layout_width

="match_parent"

android:layout_height

="match_parent"

android:paddingBottom

="@dimen/activity_vertical_margin"

android:paddingLeft

="@dimen/activity_horizontal_margin"

android:paddingRight

="@dimen/activity_horizontal_margin"

android:paddingTop

="@dimen/activity_vertical_margin"

tools:context

=".DrawerActivity"

>

<

android.support.v4.widget.DrawerLayout

android:id

="@+id/drawer_layout"

android:layout_width

="match_parent"

android:layout_height

="match_parent"

>

<

FrameLayout

android:id

="@+id/content_frame"

android:layout_width

="match_parent"

android:layout_height

="match_parent"

>

<

Button

android:id

="@+id/btn"

android:layout_width

="match_parent"

android:layout_height

="wrap_content"

android:text

="open"

/>

FrameLayout

>

<

ListView

android:id

="@+id/left_drawer"

android:layout_width

="240dp"

android:layout_height

="match_parent"

android:layout_gravity

="start"

android:background

="#111"

android:choiceMode

="singleChoice"

android:divider

="@android:color/transparent"

android:dividerHeight

="0dp"

/>

android.support.v4.widget.DrawerLayout

>

主要代码:

package

com.example.hellodrawer;

import android.os.Bundle;

import

android.app.Activity;

import

android.support.v4.widget.DrawerLayout;

import

android.view.Gravity;

import

android.view.View;

import

android.view.View.OnClickListener;

import

android.widget.Button;

public class DrawerActivity extends Activity

private

DrawerLayout mDrawerLayout =

null

;{

@Override

protected

void

onCreate(Bundle savedInstanceState) {

super

.onCreate(savedInstanceState);

setContentView(R.layout.activity_drawer);

mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);

Button button = (Button) findViewById(R.id.btn);

button.setOnClickListener(

new

OnClickListener() {

@Override

public

void

onClick(View v) {

//

按钮按下,将抽屉打开

mDrawerLayout.openDrawer(Gravity.LEFT);

}

});

}

}

参考资料

官方教程:

其他参考资料:

android左侧抽屉,Android控件之左侧抽屉菜单相关推荐

  1. Android游戏开发系统控件-Dialog

    Android游戏开发系统控件-Dialog Dialog(对话框)在Android应用开发中经常用到,下面是学习<Android游戏编程从零开始>一书,关于Dialog的初步学习. 创建 ...

  2. android什么控件能够输入多行文字,Android开发:文本控件详解——EditText(一)基本属性...

    一.简单实例: EditText输入的文字样式部分的属性,基本都是和TextView中的属性一样. 除此之外,EditText还有自己独有的属性. 二.基本属性: hint 输入框显示的提示文本 te ...

  3. 【Android】App开发-控件篇

    App开发是一个工作量比较大的项目,要学习App开发首先我们要先去学习手机中的各类工具和信息是怎么运行的,我们可以使用哪些工具来对手机进行设置.这里我采用的开发工具是Android studio. 目 ...

  4. Android常用酷炫控件(开源项目)github地址汇总

    转载一个很牛逼的控件收集帖... 第一部分 个性化控件(View) 主要介绍那些不错个性化的 View,包括 ListView.ActionBar.Menu.ViewPager.Gallery.Gri ...

  5. Android中的基础控件TextView、Button、ImageView、EditText、ProgressBar

    文章目录 1 Android中的基础控件 1.1 控件的通用属性 2 TextView 2.1 TextView的继承关系 2.2 TextView的常用属性 3 EditText 3.1 常用属性 ...

  6. android中的标题栏是什么意思,Android通用标题栏组合控件

    原标题:Android通用标题栏组合控件 快,点击蓝色"字体"关注这个公众号,一起涨姿势 由于项目中经常用到此种组合控件,就封装了下,具体效果看下图,老司机可以绕道哈! 一.主要功 ...

  7. Android中进度条控件使用

    android中进度条控件使用 ProgressBar pb = findViewById(R.id.pb);pb.setMax(100);pb.setProgress(33); 转载于:https: ...

  8. Android游戏开发系统控件-CheckBox

    Android游戏开发系统控件-CheckBox 2012/5/11 星期五 CheckBox是Android系统最普通的UI控件,继承了Button按钮 下面通过一个实例来学习 作者:wwj 功能: ...

  9. Android表格拖拽排序,Android 拖拽排序控件 DragGridView

    Android 拖拽排序控件 DragGridView Android 开发中,我们经常会遇到条目拖拽排序的需求,特别是在新闻类应用中就更普遍了.其实,我们在网上可以搜到许多关于拖拽排序的自定义控件, ...

  10. android线程改变布局,Android线程中设置控件的值提示报错的解决方法

    本文实例讲述了Android线程中设置控件的值提示报错的解决方法.分享给大家供大家参考,具体如下: 在Android线程中设置控件的值一般会与Handler联合使用,如下: package com.y ...

最新文章

  1. web3j官网的完整中文翻译(java开发区块链以太坊应用的开源类库)
  2. POJ 2728 01分数规划
  3. 一文了解 Apache Flink 核心技术
  4. [optee]-optee的加解密接口的介绍
  5. 教你如何让电脑的ADSL宽带连接开机自动拨号
  6. windows10mysql安装包_windows10上安装mysql8(zip包)
  7. OSGI 插件操作命令
  8. 10个节省时间和改善工作流的Git技巧
  9. vue 父组件传子组件数值,父值变更子获取的值没有变的问题
  10. 硬货 | 一片小小的薄膜,却可以粘住全世界!
  11. 监督学习 | SVM 之支持向量机Sklearn实现
  12. 2018-2019-1 20165301 《信息安全系统设计基础》第四周学习总结
  13. 数据库(第一范式,第二范式,第三范式)
  14. git push 提示:更新被拒绝,因为您当前分支的最新提交落后于其对应的远程分支。的解决办法
  15. Visual Basic 2012 借助DataGridView控件将Excel 2010数据导入到SQL server 2012
  16. java常用算法整理
  17. r语言degseq2_第二次RNA-seq实战总结(3)-用DESeq2进行基因表达差异分析
  18. java kdj macd_很好用的KDJ与MACD结合指标
  19. 华为升级emui10是鸿蒙系统吗,华为鸿蒙正式发布,EMUI10.0即将登场,你需要这份升级名单吗?...
  20. matlab中lab颜色空间,使用Matlab绘制图像的rgb颜色空间和Lab颜色空间分量图和分量直方图...

热门文章

  1. SqlServer怎么导入mdf、ldf文件
  2. GitKraKen 9.x|7.5.1|6.5.0 - 安装
  3. 含泪整理最优质家具虚幻UE4素材,你想要的这里都有
  4. stm32f103驱动SHT20( I2C )
  5. 微信小程序下拉刷新真机没效果_微信小程序 下拉刷新 上拉加载(示例代码)
  6. JAVA类似ABP框架_使用ABP框架踩过的坑系列5
  7. 新版驾校小程序源码开发(预约报名+科目考试在线练习平台搭建)
  8. maven阿里云仓库配置
  9. java 2017技术_2017《Java技术》预备作业 计科1502 李宇蒙
  10. Linux配置网络信息(四种方法)