Android使用DrawerLayout实现双向侧滑菜单
作者:潘建成 发布时间:2022-02-04 12:50:31
前言
在android开发中,很多的app都有使用侧滑菜单,有的是自定义控件来实现侧滑菜单,但是android给我们提供了DrawerLayout类来实现侧滑菜单,侧滑效果很好,今天我就说说怎么去使用它来实现侧滑菜单。
实现
我们先来看一下效果图:
这里我们实现的双向侧滑菜单,在界面上部加入了两个按钮,点击就会打开菜单或者关闭菜单,当然也可以自己去滑动。
布局文件的代码:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<RelativeLayout
android:layout_width="fill_parent"
android:layout_height="45dp"
android:background="#00ff00"
>
<Button
android:id="@+id/btn_toggle_left"
android:layout_width="wrap_content"
android:layout_height="50dp"
android:text="左开关"
/>
<Button
android:layout_alignParentRight="true"
android:id="@+id/btn_toggle_right"
android:layout_width="wrap_content"
android:layout_height="50dp"
android:text="右开关"
/>
</RelativeLayout>
<android.support.v4.widget.DrawerLayout
android:id="@+id/drawerlayout"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<!-- 主布局,位于DrawerLayout的第一次子控件,位置不可以放错 -->
<FrameLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<ImageView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@drawable/mainbackground"
/>
</FrameLayout>
<!-- 左侧菜单 -->
<RelativeLayout
android:id="@+id/layout_menu_left"
android:layout_gravity="start"
android:layout_width="150dp"
android:layout_height="fill_parent"
android:background="#000"
>
<TextView
android:textColor="#ffffff"
android:gravity="center"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:text="左侧菜单"
/>
</RelativeLayout>
<!-- 右侧菜单 -->
<RelativeLayout
android:id="@+id/layout_menu_right"
android:layout_gravity="end"
android:layout_width="150dp"
android:layout_height="fill_parent"
android:background="#000"
>
<TextView
android:textColor="#ffffff"
android:gravity="center"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:text="右侧菜单"
/>
</RelativeLayout>
</android.support.v4.widget.DrawerLayout>
</LinearLayout>
MainActivity的代码:
public class MainActivity extends Activity implements OnClickListener{
private DrawerLayout mDrawerLayout;
private View v_menu_left,v_menu_right;
private Button btn_left,btn_right;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
initListener();
}
private void initListener() {
btn_left.setOnClickListener(this);
btn_right.setOnClickListener(this);
}
private void initView() {
mDrawerLayout = (DrawerLayout) findViewById(R.id.drawerlayout);
v_menu_left = findViewById(R.id.layout_menu_left);
v_menu_right = findViewById(R.id.layout_menu_right);
btn_left = (Button) findViewById(R.id.btn_toggle_left);
btn_right = (Button) findViewById(R.id.btn_toggle_right);
}
@Override
public void onClick(View v) {
if(v.getId()==R.id.btn_toggle_left){
toggleLeft();
}else if(v.getId()==R.id.btn_toggle_right){
toggleRight();
}
}
private void toggleRight() {
if(mDrawerLayout.isDrawerOpen(v_menu_right)){
mDrawerLayout.closeDrawer(v_menu_right);
}else{
mDrawerLayout.openDrawer(v_menu_right);
}
}
private void toggleLeft() {
if(mDrawerLayout.isDrawerOpen(v_menu_left)){
mDrawerLayout.closeDrawer(v_menu_left);
}else{
mDrawerLayout.openDrawer(v_menu_left);
}
}
}
在布局文件中,第一个子控件是主布局,就是显示在界面中央的位置,然后第二个和第三个控件作为左菜单和右菜单在两侧隐藏,然后滑动的时候慢慢显示出来。在第二和第三个控件的属性设置里,需要注意的是android:layout_gravity属性,这个属性决定了菜单的位置是左还是右。当设置成“start”的时候,菜单位于左侧,当设置成“end”的时候,菜单位于右侧,所以菜单的位置和控件的顺序没有关系,只和属性值有关。
然后在MainActivity里面,我们得到DrawerLayout 对象,和两个菜单对象,对按钮添加点击方法。拿左菜单来说,当点击按钮的时候,如果左菜单是关闭的,那么我们就打开菜单,如果菜单是打开的,那么我们就关闭它。这就需要知道DrawerLayout的几个常用方法了。
isDrawerOpen(View v)
该方法用来判断菜单是否处于打开状态,传入的是一个View,表示菜单的View,也就是左菜单或者是右菜单。因为菜单的数量有一个或者以上,所以需要传入不同的View来判断是哪一个菜单。
closeDrawer(View v)
该方法用来关闭菜单,传入的也是菜单的View
openDrawer(View v)
该方法用来打开菜单,同关闭菜单的操作相似。
用这三个方法基本就可以实现上面的效果了,好了,简单的双向侧滑菜单就完成了,不需要使用自定义的控件,自定义的控件可能有更加丰富的动画效果,这就需要大家自己去是实现了。
源码下载点这里。
来源:http://blog.csdn.net/programchangesworld/article/details/48399401


猜你喜欢
- 1 背景去年有很多人私信告诉我让说说自定义控件,其实通观网络上的很多博客都在讲各种自定义控件,但是大多数都是授之以鱼,却很少有较
- 前言为了便于文件在网络中的传输和保存,通常将文件进行压缩操作,常用的压缩格式有rar、zip和7z,本文将介绍在C#中如何对这几种类型的文件
- 前言工作中是否遇到这样的场景?1、需要异步线程执行,而且需要获取到线程执行返回的结果。2、如果执行过程异常,可以按照自定义方式消费异常信息。
- lombok插件使用引入依赖,在项目中使用Lombok可以减少很多重复代码的书写。比如说getter/setter/toString等方法的
- 之前在项目中会用到在Java在后台把数据填入Word文档的模板来提供前台下载,为了自己能随时查看当时的实现方案及方便他人学习我写了这篇博客,
- Spring Boot应用内存飙升一个简单的Spring Boot应用, 几乎只有一个用户在用,内存竟然达到1.2G, 可怕服务现状由于之前
- 背景系统: SpringBoot开发的Web应用;ORM: JPA(Hibernate)接口功能简述: 根据实体类ID到数据库中查询实体信息
- 1.下载JRebel and XRebel for Intellij插件2. 激活请查看这个文章http://www.cicoding.cn
- 一、概念HttpClientAndroid 6中移除(API数量多扩展困难)。HttpURLConnection目前官方集成的。OKHttp
- 本文实例讲述了java实现将结果集封装到List中的方法。分享给大家供大家参考,具体如下:import java.sql.Connectio
- 什么是mybatis,mybatis有什么特点,下面先给大家介绍下mybatis的概念及特点。jdbc开发优缺点:1)优点:简单易学,上手快
- 过滤器模式(Filter Pattern)或标准模式(Criteria Pattern)是一种设计模式,这种模式允许开发人员使用不同的标准来
- 静态代理第一种实现(基于接口):1》接口public interface Hello { void say(String msg);}2》目
- 本文实例讲述了Java使用Random类生成随机数。分享给大家供大家参考,具体如下:一 代码import java.util.Random;
- 前言在segmentfault上看到一个问题:java有完善的GC机制,那么在java中是否会出现内存泄漏的问题,以及能否给出一个内存泄漏的
- 一、Close与Dispose这两种方法的区别调用完了对象的Close方法后,此对象有可能被重新进行使用;而Dispose方法来说,此对象所
- 一、文件的编码package com.study.io;/*** 测试文件编码*/public class EncodeDemo {/***
- 首先从字面意思理解两个词onTouchEvent:触发触摸事件onInterceptTouchEvent:触发拦截触摸事件通过查看源代码及类
- 在项目开发过程中,不可避免的会升级开发工具。这次我在旧项目版本升级到新版Unity2021.2.x时,出现Visual Studio无法定位
- 本文实例分析了c#中Empty()和DefalutIfEmpty()用法。分享给大家供大家参考。具体分析如下:在项目中,当我们想获取IEnu