欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android开发之开发者头条(二)实现左滑菜单

程序员文章站 2024-03-01 11:12:22
在上篇文章给大家介绍了android开发之开发者头条(一)启动页实现,感兴趣的朋友可以参考下。 title: 带你实现开发者头条(二) 实现左滑菜单 tags: 左...

在上篇文章给大家介绍了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开发之开发者头条(二)实现左滑菜单的全部介绍,希望对大家有所帮助!