Android开发之开发者头条(二)实现左滑菜单
在上篇文章给大家介绍了android开发之开发者头条(一)启动页实现,感兴趣的朋友可以参考下。
title: 带你实现开发者头条(二) 实现左滑菜单
tags: 左滑菜单,android 自带侧滑,drawerlayout
grammar_cjkruby: true
今天开始模仿开发者头条的侧滑菜单,是本系列第二篇文章,相信大家已经看到很多app使用这种侧滑。今天我来教大家用android自带drawerlayout控件实现。
drawerlayout是supportlibrary包中实现了侧滑菜单效果的控件,可以说drawerlayout是因为第三方控件如menudrawer等的出现之后,google借鉴而出现的产物。drawerlayout分为侧边菜单和主内容区两部分,侧边菜单可以根据手势展开与隐藏(drawerlayout自身特性),主内容区的内容可以随着菜单的点击而变化(这需要使用者自己实现)。
一.先给大家展示下效果图:
二.代码实现
1.drawerlayout其实是一个布局控件,跟linearlayout等控件是一种东西,但是drawerlayout带有滑动的功能。只要按照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" > <relativelayout android:layout_width="match_parent" android:layout_height="match_parent" android:cliptopadding="true" android:fitssystemwindows="true" > <include android:id="@+id/rl_title" layout="@layout/layout_main_title" /> <!-- the main content view --> <framelayout android:id="@+id/content_frame" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_below="@+id/rl_title" android:background="@color/white_normal" > </framelayout> </relativelayout> <!-- the navigation view --> <framelayout android:id="@+id/left_drawer" android:layout_width="280dp" android:layout_height="match_parent" android:layout_gravity="start" > <!-- 左侧菜单 --> <include layout="@layout/layout_main_left" /> </framelayout> </android.support.v4.widget.drawerlayout>
注意事项
主内容区的布局代码要放在侧滑菜单布局的前面,这可以帮助drawerlayout判断谁是侧滑菜单,谁是主内容区
侧滑菜单的部分的布局(这里是listview)可以设置layout_gravity属性,他表示侧滑菜单是在左边还是右边。
2.mainactivity.java 继承fragmentactivity
1).设置内容fragment,设置状态栏
2).处理左侧点击事件,在点击事件中设置选中背景,关闭左边侧滑菜单。
public class mainactivity extends fragmentactivity{ private drawerlayout mdrawerlayout; private relativelayout rlhome, rlgift, rlshare; private int currentselectitem = r.id.rl_home;// 默认首页 private contentfragment contentfragment; @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); mdrawerlayout = (drawerlayout) findviewbyid(r.id.drawer_layout); findviewbyid(r.id.iv_menu).setonclicklistener(clicklistener); initleftmenu();//初始化左边菜单 contentfragment=new contentfragment(); getsupportfragmentmanager().begintransaction().add(r.id.content_frame,contentfragment).commit(); setwindowstatus(); } private void initleftmenu() { rlhome = (relativelayout) findviewbyid(r.id.rl_home); rlgift = (relativelayout) findviewbyid(r.id.rl_gift); rlshare = (relativelayout) findviewbyid(r.id.rl_share); rlhome.setonclicklistener(onleftmenuclicklistener); rlgift.setonclicklistener(onleftmenuclicklistener); rlshare.setonclicklistener(onleftmenuclicklistener); rlhome.setselected(true); } private onclicklistener onleftmenuclicklistener = new onclicklistener() { @override public void onclick(view v) { if (currentselectitem != v.getid()) {//防止重复点击 currentselectitem=v.getid(); noitemselect(); switch (v.getid()) { case r.id.rl_home: rlhome.setselected(true); contentfragment.setcontent("这是首页"); break; case r.id.rl_gift: rlgift.setselected(true); contentfragment.setcontent("这是礼物兑换"); break; case r.id.rl_share: rlshare.setselected(true); contentfragment.setcontent("这是我的分享"); break; } mdrawerlayout.closedrawer(gravity.left); } } }; private void noitemselect(){ rlhome.setselected(false); rlgift.setselected(false); rlshare.setselected(false); } private onclicklistener clicklistener = new onclicklistener() { @override public void onclick(view v) { switch (v.getid()) { case r.id.iv_menu:// 打开左边抽屉 mdrawerlayout.opendrawer(gravity.left); break; } } }; // 设置状态栏 private void setwindowstatus() { if (build.version.sdk_int >= build.version_codes.kitkat) { // 透明状态栏 getwindow().addflags(windowmanager.layoutparams.flag_translucent_status); // 透明导航栏 getwindow().addflags(windowmanager.layoutparams.flag_translucent_navigation); // 设置状态栏颜色 getwindow().setbackgrounddrawableresource(r.color.main_color); } } }
3.左侧菜单item选中背景的布局文件 selector_left_menu_item.xml。
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@color/menu_left_item_select" android:state_selected="true"/> <item android:drawable="@color/white_normal"/> </selector>
4.contentfragment 显示内容的fragment 这里我加了一个设置内容的方法,就是用来点击左侧切换显示用的。
public class contentfragment extends fragment{ private textview tvcontent; @override public view oncreateview(layoutinflater inflater, viewgroup container,bundle savedinstancestate){ view rootview=layoutinflater.from(getactivity()).inflate(r.layout.fragment_content, null); tvcontent=(textview) rootview.findviewbyid(r.id.tv_content); return rootview; } public void setcontent(string content){ tvcontent.settext(content); } }
5.drawerlayout与fragment是什么关系?
我们看到很多使用drawerlayout的代码中都同时使用了fragment,这会造成误解,以为使用drawerlayout必须用到fragment,其实这是错误的,使用fragment是因为在侧滑菜单被点击的时候,主内容区如果内容比较复杂,用fragment去填充会更容易,如果你的主内容区只是一个简单的字符串,只想在不同菜单点击的时候更新一下字符串的内容,我觉得没必要用fragment。我这边用fragment所做的就是更新字符串内容这么简单。
以上内容是针对android开发之开发者头条(二)实现左滑菜单的全部介绍,希望对大家有所帮助!
上一篇: Spring注解方式防止重复提交原理详解