一、SlidingPaneLayout

  v4包下的控件,使用简单,功能简洁。官方文档明确说明该控件只能左侧滑动。使用如下:

<android.support.v4.widget.SlidingPaneLayout
android:id="@+id/slidingPaneLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"> <ListView
android:layout_width="200dp"
android:layout_height="match_parent"/> <include layout="@layout/layout_main_content"/> </android.support.v4.widget.SlidingPaneLayout>

  SlidingPaneLayout有两个子节点: 第一个为菜单项布局,第二个为内容布局。

  java代码中找到该控件,设置监听:

  

SlidingPaneLayout spl = (SlidingPaneLayout) findViewById(R.id.slidingPaneLayout);
if (spl != null) {
spl.setPanelSlideListener(new SlidingPaneLayout.PanelSlideListener() { @Override
public void onPanelSlide(View panel, float slideOffset) {
//正在滑动的监听
} @Override
public void onPanelOpened(View panel) {
//打开的监听
} @Override
public void onPanelClosed(View panel) {
//关闭的监听
}
});
}

二 DrawerLayout(抽屉效果)

  

android.support.v4.widget.DrawerLayout
android:id="@+id/dl"
android:layout_width="match_parent"
android:layout_height="match_parent"> <TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#ff00ff"
android:gravity="start"
android:text="主布局内容"/> <TextView
android:layout_width="200dp"
android:layout_height="match_parent"
android:layout_gravity="start"
android:background="#00ffff"
android:text="侧边菜单栏内容"/>
</android.support.v4.widget.DrawerLayout>

    Drawerlayout标签中可以有三个子节点,一个是左边菜单,一个是主布局,还有右侧菜单,另外需要在左边菜单起始位置设置为                   android:layout_gravity="start"否则会报错

    注意:官方手册提示:内容控件必须写在第一个,并且不能含有layout_gravity属性

    示例代码如下:

private DrawerLayout dl;
private Toolbar toolbar;
private ActionBarDrawerToggle actionBarDrawerToggle; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);//设置标题为当前的Toolbar
getSupportActionBar().setHomeButtonEnabled(true);//设置home按钮可用
getSupportActionBar().setDisplayHomeAsUpEnabled(true);//设置显示回到主页的按钮可用,即:返回箭头显示出来
dl = (DrawerLayout) findViewById(R.id.dl);//找到抽屉控件DrawerLayout
//创建一个标题栏与抽屉的关联开关
actionBarDrawerToggle = new ActionBarDrawerToggle(this, dl, toolbar, R.string.app_name, R.string.app_name);
actionBarDrawerToggle.syncState();//同步抽屉的指示器状态,只有加这一句抽屉的开关才会改变Toolbar上的NavigationIcon图标
dl.addDrawerListener(actionBarDrawerToggle);//添加抽屉监听者,该监听者内部控制了ActionBar的NavigationIcon图标按钮
dl.addDrawerListener(new DrawerLayout.DrawerListener() {//添加开发者自己处理的监听者 @Override
public void onDrawerSlide(View drawerView, float slideOffset) {
System.out.println("----onDrawerSlide- " + slideOffset);
} @Override
public void onDrawerOpened(View drawerView) {
System.out.println("----onDrawerOpened-");
} @Override
public void onDrawerClosed(View drawerView) {
System.out.println("----onDrawerClosed-"); } @Override
public void onDrawerStateChanged(int newState) {
System.out.println("----onDrawerStateChanged- " + newState); }
});
}

三、NavigationView

  MD的控件,用于解决DrawerLayout中的菜单项设置太麻烦的问题,主流的做法都是用NavigationView来做DrawerLayout的菜单。

  

用于侧滑菜单中的menu布局。之前Google在V4包中推出自己的 DrawerLayout作为抽屉侧滑菜单,标准使用方法可以参考 google 原生态 抽屉式侧滑菜单 Android DrawerLayout 布局的使用介绍。 
当时的官方布局是这样的:

<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" >
<!-- the main content view -->
<FrameLayout
android:id="@+id/frame_content"
android:layout_width="match_parent"
android:layout_height="match_parent" >
</FrameLayout>
<ListView
android:id="@+id/drawer_list"
android:layout_width="240dp"
android:layout_height="match_parent"
android:layout_gravity="start"
android:background="#9999cc"
android:choiceMode="singleChoice"
android:divider="@android:color/transparent"
android:dividerHeight="0dp" >
</ListView>
</android.support.v4.widget.DrawerLayout>

   

其实这次谷歌只是将上面的ListView布局替换成NavigationView了。简化了之前ListView写适配器的繁琐。

先如今布局改成如下:

  

<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent">
<!-- the main content view -->
<include layout="@layout/layout_content" />
<!-- the navigetion view -->
<android.support.design.widget.NavigationView
android:id="@+id/navigationView"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="left"
android:fitsSystemWindows="true"
app:headerLayout="@layout/layout_header"
app:menu="@layout/layout_menu">
</android.support.design.widget.NavigationView>
</android.support.v4.widget.DrawerLayout>

其中NavigationView 中的 android:layout_gravity=”start” 属性来控制抽屉菜单从哪边滑出,一般“start ”从左边滑出,“end”从右边滑出。

这里最主要的两个属性分别是: 
1.app:headerLayout: 给NavigationView添加头部布局 
2.app:menu:给NavigationView添加menu菜单布局

  代码中控制NavigationView

  

private void initNavigationView(){
navigationView = (NavigationView) findViewById(R.id.navigationView);
drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
//设置侧滑菜单选择监听事件
navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(MenuItem menuItem) {
menuItem.setChecked(true);
//关闭抽屉侧滑菜单
drawerLayout.closeDrawers();
return true;
}
});
} @Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == android.R.id.home){
//打开抽屉侧滑菜单
drawerLayout.openDrawer(GravityCompat.START);
}
return super.onOptionsItemSelected(item);
}

  

关于NavigationView中item的字体颜色和icon选中状态颜色是去当前主题theme中的

<--正常状态下字体颜色和icon颜色-->

<item name="android:textColorPrimary">@android:color/darker_gray</item>

<--选中状态icon的颜色和字体颜色-->

<item name="colorPrimary">@color/accent_material_light</item>

也可以通过如下方法或者属性来改变这一状态:

  1. setItemBackgroundResource(int):给menu设置背景资源,对应的属性app:itemBackground
  2. setItemIconTintList(ColorStateList):给menu的icon设置颜色,对应的属性app:itemIconTint
  3. setItemTextColor(ColorStateList):给menu的item设置字体颜色,对应的属性app:itemTextColor

android侧滑菜单笔记的更多相关文章

  1. Android侧滑菜单代码实现

    前两天学习了hyman老师讲的Android侧滑菜单的实现,经过自己的整理分享出来给大家学习一下 现在很多APP都有菜单侧滑的功能,本篇文章主要讲解使用自定义的HorizontalScrollView ...

  2. Android 侧滑菜单的简单实现(SlidingMenu)二

    在上一篇博文中已经简单的实现了侧滑菜单,代码也很简单,就几行代码. 这篇文章依然讲侧滑菜单,与前一篇文章不同的是,这篇文章用不同的代码方式来实现侧滑菜单. 在前面的文章中已经用了在Activity中通 ...

  3. Android 侧滑菜单的简单实现(SlidingMenu)

    在我还没有学习Android的时候就用过侧滑菜单的APP,当时第一个感觉是:哇塞,这效果不错!当然,现在自己都已经学Android了,这效果当然也要做出来啊~ SlidingMenu是一种比较新的设置 ...

  4. 教你用DrawLayout 实现Android 侧滑菜单

    现在的APP越来越注重用户体验,百度视频客户端有一个特效还是挺吸引人的,在主界面手指向右滑动,就可以将菜单展示出来,而主界面会被隐藏大部分,但是仍有左侧的一小部分同菜单一起展示.类似的还有天天动听,人 ...

  5. android 侧滑菜单

    就是用手一滑才出现,占手机半个多屏幕的菜单.为了美观和页面转跳,很多时候要用到. 实现的话就是使用官方的DrawerLayout,注意这个布局一定要是最顶层的布局. 在DrawerLayout里面直接 ...

  6. Android侧滑菜单和轮播图之滑动冲突

    接手一个项目,有一个问题需要修改:轮播图不能手动滑动,手动滑动轮播图只会触发侧滑菜单. 猜测:viewpager控件(轮播图)的触摸事件被SlidingMenu控件(侧滑菜单,非第三方项目,乃是上个开 ...

  7. Android笔记(五十二) 侧滑菜单SlidingMenu

    SlidingMenu是一个优秀的开源项目,可以实现侧滑菜单,简单介绍一下这SlidingMenu的使用: 常用属性和方法: setTouchModeAbove(int i )是否可以通过滑动手势打开 ...

  8. 安卓开发笔记——关于开源项目SlidingMenu的使用介绍(仿QQ5.0侧滑菜单)

    记得去年年末的时候写过这个侧滑效果,当时是利用自定义HorizontalScrollView来实现的,效果如下: 有兴趣的朋友可以看看这篇文件<安卓开发笔记——自定义HorizontalScro ...

  9. Android之自定义侧滑菜单

    先来上图: 我们把主界面从左向右拉动,可以看到地下有一层菜单页,从透明渐渐变得不透明,从小渐渐变大,感觉上觉得菜单页是从屏幕外面被拉到屏幕中的.下面的代码实现这个DEMO: 首先是自定义控件Slidi ...

随机推荐

  1. Oracle学习笔记之数据类型

    1. mysql和oracle做数据同步.其中表的一个字段在mysql中设置为varchar(6),Oracle中为varchar2(6)   但mysql中能正常存放的数据同步到oracle中却抱O ...

  2. TOP命令详解

    TOP是一个动态显示过程,即可以通过用户按键来不断刷新当前状态.如果在前台执行该命令,它将独占前台,直到用户终止该程序为止.比较准确的说,top命令提供了实时的对系统处理器的状态监视.它将显示系统中C ...

  3. p2p穿透技术

    ios 怎么和wifi外设摄像头实时传输视频 ios 控制wifi摄像头外设的拍照.录像.删除照片等等都可以通过tcp/ip 发送定义好的json指令实现. 但是不知道怎么和wifi外设摄像头实时传输 ...

  4. poj2823Sliding Window(线段树求最值)

    链接 裸线段树 这题时间卡的挺棒 #include <iostream> #include<cstdio> #include<cstring> #include&l ...

  5. C语言中的位拷贝与值拷贝浅谈(转载)

    注:C语言实现的PHP变量的赋值过程中,就涉及到了 深拷贝和浅拷贝 位拷贝拷贝的是地址(也叫浅拷贝),而值拷贝则拷贝的是内容(深拷贝).深拷贝和浅拷贝可以简单理解为:如果一个类拥有资源,当这个类的对象 ...

  6. 如何配置Flash Media Live Encoder (FMLE)从而使用Azure直播服务

    Azure媒体服务中的直播服务已经在中国Azure开始公共预览.通过这篇英文博客,您可以了解到直播服务对RTMP协议的支持.以及多种客户端编码器的配置. http://blogs.msdn.com/b ...

  7. Dataguard Content

    1.Dataguard环境设计的三个重要概念 1.1 Primary数据库 在Data Guard的环境中与Standby数据库对应的数据库即是Primary数据库,也就是Primary数据库正在运行 ...

  8. C#中数据类型的安全转换(is,as)

    原文 C#中数据类型的安全转换(is,as) 下面代码中,不能装箱,在强制类型转换时出错,因为之前 c 是 class 类型,而却要把它转换为 int 类型,这是不可以的.虽然编译器能通过编译,但是 ...

  9. 《深入Java虚拟机学习笔记》- 第14章 浮点运算

    <深入Java虚拟机学习笔记>- 第13章 浮点运算

  10. Java8 Stream API

    Stream是Java8中,操作集合的一个重要特性. 从iteration到Stream操作 当你操作一个集合的时候,你通常的做法是迭代每一个元素,然后处理你想要的事情.举个例子: String co ...