当前位置: 移动技术网 > IT编程>移动开发>Android > Android开发之开发者头条(二)实现左滑菜单

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

2019年07月24日  | 移动技术网IT编程  | 我要评论

辉哥图库,马云老婆张瑛和儿子,房县豪华办公楼

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

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网