一、问题描述

  侧边栏是Android应用中十分常见的界面效果,可随主屏在左侧或右侧联动,是特别适应手机等小屏幕特性的典型界面设计方案之一,常用作应用的操作菜单,如图所示

  实现侧边栏可以使用第三方组件slidingmenu实现和Google官方提供的滑动抽屉组件DrawerLayout实现,下面就分别使用这两种方法实现左右滑动的侧边栏

二、先使用之前讲过的ActionBar制作标题栏

  这里只贴出代码,相关知识请查阅 《Android典型界面设计(4)——使用ActionBar+Fragment实现tab切换》

protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initActionBar();
}
private void initActionBar(){
actionBar=super.getActionBar();
actionBar.show();
actionBar.setDisplayShowHomeEnabled(true);
actionBar.setDisplayShowTitleEnabled(false);
actionBar.setDisplayHomeAsUpEnabled(true);
actionBar.setHomeAsUpIndicator(R.drawable.com_btn);
actionBar.setDisplayShowCustomEnabled(true);
TextView tvTitle=new TextView(this);
tvTitle.setText("主 页");
tvTitle.setTextColor(Color.WHITE);
tvTitle.setTextSize(18);
tvTitle.setGravity(Gravity.CENTER);
LayoutParams params=new LayoutParams
(LayoutParams.MATCH_PARENT,LayoutParams.WRAP_CONTENT);
tvTitle.setLayoutParams(params);
actionBar.setCustomView(tvTitle);
}

ActionBar样式:

<style name="actionbar_style" parent="@android:style/Widget.Holo.Light.ActionBar">
<item name="android:background">#218FCC</item>
<item name="android:actionBarSize">150dip</item>
<!—隐藏ActionBar 的ICON图标-- >
<item name="android:icon">@android:color/transparent</item>
<item name="android:itemPadding">20dip</item>
</style>
<!—activity使用此样式-->
<style name="AppTheme" parent="AppBaseTheme">
<item name="android:actionBarStyle">@style/actionbar_style</item>
</style>

菜单:(右侧头像按钮)

<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:id="@+id/usersetting"
android:orderInCategory="100"
android:showAsAction="ifRoom"
android:icon="@drawable/biz_tie_user_avater_default_common"
/> </menu>
三、使用slidingmenu实现
private SlidingMenu slidingMenu;
private void initSlidingMenu(){
slidingMenu=new SlidingMenu(this);//创建侧边栏
//设置菜单模式,LEFT(仅左侧边栏) RIGHT(仅右侧边栏)
//LEFT_RIGHT(左右侧边栏)
slidingMenu.setMode(SlidingMenu.LEFT_RIGHT);
slidingMenu.setMenu(R.layout.menu_left_layout);//设置第一个(左)侧边栏
//设置第二个(右)侧边栏,若设置LEFT_RIGHT模式使用该方法设置右侧边栏
slidingMenu.setSecondaryMenu(R.layout.navigation_layout);
//将侧边栏粘连到Activity上
slidingMenu.attachToActivity(this, SlidingMenu.SLIDING_CONTENT);
//设置侧边栏阴影大小
slidingMenu.setShadowWidth(10);
//设置偏离距离
slidingMenu.setBehindOffsetRes(R.dimen.sliding_menu_offset);
//全屏模式,全屏滑动都可打开
slidingMenu.setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN);
}

在onCreate()中调用initSlidingMenu()方法实现SlidingMenu的构建

protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initActionBar();
initSlidingMenu();
}

到此滑动左右屏幕就出现侧边栏了,下面实现单击Actionbar两端按钮实现左右侧边栏的显示控制,代码如下:

@Override
public boolean onOptionsItemSelected(MenuItem item){
switch(item.getItemId()){
case android.R.id.home://左侧home区域
slidingMenu.toggle();//交替显示或隐藏侧边栏
break;
case R.id.usersetting://右侧按钮菜单
if(!slidingMenu.isSecondaryMenuShowing()){
slidingMenu.showSecondaryMenu();//显示右侧栏
}else{
slidingMenu.toggle();//通过toggle方法隐藏右侧边栏
}
break;
}
return super.onOptionsItemSelected(item);
}

Ok完成,至于左右侧边栏的布局文件menu_left_layout 和navigation_layout,大家可自己简单设计一下或见源代码

四、使用drawerLayout实现

  drawerLayout的使用也很方便,drawerLayout其实是一个布局控件,跟LinearLayout等控件是一种东西,但是drawerLayout带有滑动的功能。只要按照drawerLayout的规定布局方式写完布局,就能有侧滑的效果。drawerLayout分为侧边菜单和主内容区两部分,侧边菜单可以根据手势展开与隐藏。

  有两点要注意:主内容区的布局代码要放在侧滑菜单布局的前面,这可以帮助DrawerLayout判断谁是侧滑菜单,谁是主内容区;侧滑菜单的部分通过设置layout_gravity属性,决定侧滑菜单是在左边还是右边 ,layout_gravity属性为start表示左侧边栏,end表示右侧边栏

1、Activity的布局如下:

<?xml version="1.0" encoding="utf-8"?>
<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" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:text="这是主界面" />
</LinearLayout>
<include layout="@layout/menu_left_layout"
android:layout_width="200dp"
android:layout_height="match_parent"
android:layout_gravity="start"
/>
<include
android:id="@+id/right_sliding"
android:layout_width="240dp"
android:layout_height="match_parent"
layout="@layout/navigation_layout"
android:layout_gravity="end"
/>
</android.support.v4.widget.DrawerLayout>

  menu_left_layout 和navigation_layout 为左右侧边栏的布局文件

  2、Activiy代码

public class MainActivity extends Activity {
private DrawerLayout drawerLayout;
private ActionBarDrawerToggle toggle;
private ActionBar actionBar;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initActionBar();
initDrawerLayout();
}
private void initDrawerLayout(){
drawerLayout=(DrawerLayout)super.findViewById(R.id.drawer_layout);
drawerLayout.setScrimColor(Color.TRANSPARENT);
toggle=new ActionBarDrawerToggle(this,drawerLayout,
R.drawable.back_move_details_normal,R.string.drawer_open
,R.string.drawer_close){
public void onDrawerClosed(View drawerView) {
super.onDrawerClosed(drawerView);
}
public void onDrawerOpened(View drawerView) {
super.onDrawerOpened(drawerView);
} };
drawerLayout.setDrawerListener(toggle);
}
private void toggleLeftSliding(){//该方法控制左侧边栏的显示和隐藏
if(drawerLayout.isDrawerOpen(Gravity.START)){
drawerLayout.closeDrawer(Gravity.START);
}else{
drawerLayout.openDrawer(Gravity.START);
}
}
private void toggleRightSliding(){//该方法控制右侧边栏的显示和隐藏
if(drawerLayout.isDrawerOpen(Gravity.END)){
drawerLayout.closeDrawer(Gravity.END);
}else{
drawerLayout.openDrawer(Gravity.END);
}
}
@Override
public boolean onOptionsItemSelected(MenuItem item){
switch(item.getItemId()){
case android.R.id.home:
toggleLeftSliding();
break;
case R.id.usersetting:
toggleRightSliding();
break;
} return super.onOptionsItemSelected(item);
} }
}

OK完成,initActionBar()方法代码和上例相同,这里不再附加

  想要了解更多内容的小伙伴,可以点击查看源码,亲自运行测试。

  疑问咨询或技术交流,请加入官方QQ群: (452379712)

作者:杰瑞教育
出处:http://www.cnblogs.com/jerehedu/ 
本文版权归烟台杰瑞教育科技有限公司和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
 

Android典型界面设计(5)——使用SlidingMenu和DrawerLayout分别实现左右侧边栏的更多相关文章

  1. Android典型界面设计(3)——访网易新闻实现双导航tab切换

    一.问题描述 双导航tab切换(底部区块+区域内头部导航),实现方案底部区域使用FragmentTabHost+Fragment, 区域内头部导航使用ViewPager+Fragment,可在之前博客 ...

  2. Android典型界面设计(6)——ActionBar Tab+ViewPager+Fagment实现滑动导航

    一.问题描述 在Android典型界面设计一文中,实现典型滑动导航界面,其实使用ActionBar 也可以轻松实现这一效果,甚至也可实现类似Android典型界面设计(3)的双导航效果.可见Actio ...

  3. Android典型界面设计(7) ——DrawerLayout+Fragement+ViewPager+PagerTabStrip实现双导航

    一.问题描述 在Android典型界面设计(3)的我们实现了双导航效果,即外层底部导航和内部区域的头部导航,如网易新闻等很多应用采用了这种导航,但Google提供DrawerLayout可实现抽屉式导 ...

  4. Android典型界面设计-访网易新闻实现双导航tab切换

    一.问题描述 双导航tab切换(底部区块+区域内头部导航),实现方案底部区域使用FragmentTabHost+Fragment, 区域内头部导航使用ViewPager+Fragment,可在之前博客 ...

  5. Android典型界面设计——ViewPage+Fragment实现区域顶部tab滑动切换

    一.问题描写叙述 本系列将结合案例应用,陆续向大家介绍一些Android典型界面的设计,首先说说tab导航,导航分为一层和两层(底部区块+区域内头部导航).主要实现方案有RadioGroup+View ...

  6. Android典型界面设计(4)——使用ActionBar+Fragment实现tab切换

    一.问题描述 之前我们使用ViewPager+Fragment区域内头部导航,在Android 3.0之后Google增加了新的ActionBar,可方便的实现屏幕Head部区域的 设计如返回键.标题 ...

  7. Android典型界面设计——FragmentTabHost+Fragment实现底部tab切换

    一.问题描述 在上次博文中,我们使用RadioGroup+ViewPage+Fragmen实现了顶部滑动导航(查看文章:http://www.cnblogs.com/jerehedu/p/460759 ...

  8. Android典型界面设计(8) ——ViewPager+PagerSlidingTabStrip实现双导航

    一.问题描述 PagerSlidingTabStrip是android开源项目,指示器控件.官网地址:https://github.com/astuetz/PagerSlidingTabStrip 该 ...

  9. Android的界面设计工具 DroidDraw

    Android的界面设计工具 DroidDraw DroidDraw 下载地址:http://code.google.com/p/droiddraw/ 如图 也可以使用在线的版本(http://www ...

随机推荐

  1. My Sql控制台命令

    1.连接Mysql 格式: mysql -h主机地址 -u用户名 -p用户密码 1.连接到本机上的MYSQL.首先打开DOS窗口,然后进入目录mysql\bin,再键入命令mysql -u root ...

  2. MFC单文档

    一.创建并运行MFC单文档程序 1.创建单文档程序 这里使用的是VS2017.首先,打开VS2017,选择文件->新建->项目,然后选择Visual C++ -> MFC /ATL& ...

  3. Codeforces 5C Longest Regular Bracket Sequence(DP+括号匹配)

    题目链接:http://codeforces.com/problemset/problem/5/C 题目大意:给出一串字符串只有'('和')',求出符合括号匹配规则的最大字串长度及该长度的字串出现的次 ...

  4. poj1015 01二维背包

    /* 给定辩控双方给每个人的打分p[i],d[i], dp[j][k]表示前i个人有j个被选定,选定的人的辩控双方打分差之和是k,此状态下的最大辩控双方和 按01背包做,体积一维是1,体积二维是辩控双 ...

  5. hdu1423LCIS zoj2432 必须掌握!

    LCIS就是最长上升公共子序列,要结合LIS和LCS来求 LIS:f[j]=max(f[i])+1; LCS:f[i,j]=max(f[i-1,j],f[i,j-1]或f[i-1,j-1]+1 那么对 ...

  6. python 全栈开发,Day101(redis操作,购物车,DRF解析器)

    昨日内容回顾 1. django请求生命周期? - 当用户在浏览器中输入url时,浏览器会生成请求头和请求体发给服务端 请求头和请求体中会包含浏览器的动作(action),这个动作通常为get或者po ...

  7. 为什么Nginx性能比Apache高

    Nginx的工作原理 nginx在启动后,会有一个master进程和多个worker进程.master进程主要用来管理worker进程,包含:接收来自外界的信号,向各worker进程发送信号,监控wo ...

  8. JS实现品字布局

    在网页后台中常用的布局是头部+侧边栏的形式 为了省去多于代码和重复修改多个页面 头部和侧边栏都是共用的,一直不改变的,所以写死在页面中. 中间的内容根据点击而发生改变,所以用iframe包起来 如何实 ...

  9. python全栈开发day49-jquery的位置信息、事件流、事件对象,事件委托,事件绑定和解绑

    一.昨日内容回顾    1. jQuery的属性操作 1) html属性操作:attr 2) DOM属性操作:prop 3) 类样式操作:addClass.removeClass.toggleClas ...

  10. Codeforces Round #228 (Div. 1)

    今天学长给我们挂了一套Div.1的题,难受,好难啊. Problem A: 题目大意:给你n个数字,让你叠成n堆,每个数字上面的数的个数不能超过这个数,如 3 上面最多放三个数字 问你,最少能放几堆. ...