转载本专栏文章,请注明出处,尊重原创 。文章博客地址:道龙的博客

为了提高兴趣,咱们开头先看看最终要实现什么样的效果:

侧拉菜单在Android应用中非常常见,它的实现方式太多了,今天我们就说说使用Google提供的DrawerLayout来实现侧拉菜单效果。简单模仿一下网易客户端的侧边栏。

DrawerLayout的实现其实非常简单,可以说是“傻瓜式使用”。只要按照官方文档提供的步骤一步步实现,就没有太大的问题。

首先,我们对一个应用定义一个布局

<android.support.v4.widget.DrawerLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/drawerlayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <!--中间布局-->

    <RelativeLayout
        android:id="@+id/fragment_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <RelativeLayout
            android:id="@+id/title_bar"
            android:layout_width="match_parent"
            android:layout_height="48dp"
            android:background="#0cbfe8">

            <ImageView
                android:id="@+id/leftmenu"
                android:layout_width="48dp"
                android:layout_height="48dp"
                android:padding="12dp"
                android:src="@drawable/menu"/>

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="48dp"
                android:layout_centerInParent="true"
                android:gravity="center"
                android:text="网易"/>

            <ImageView
                android:id="@+id/rightmenu"
                android:layout_width="48dp"
                android:layout_height="48dp"
                android:layout_alignParentRight="true"
                android:padding="12dp"
                android:src="@drawable/ic_action_user"/>
        </RelativeLayout>

        <LinearLayout
            android:id="@+id/content"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_below="@id/title_bar"
            android:orientation="vertical"/>
    </RelativeLayout>

    <!--左侧的布局-->
    <RelativeLayout
        android:id="@+id/left"
        android:layout_width="200dp"
        android:layout_height="match_parent"
        android:layout_gravity="left"
        android:background="@android:color/white">

        <!--这里通过listview放其他控件-->
        <ListView
            android:id="@+id/left_listview"
            android:layout_width="match_parent"
            android:layout_height="match_parent">
        </ListView>
    </RelativeLayout>

    <!--右侧布局-->
    <RelativeLayout
        android:id="@+id/right"
        android:layout_width="260dp"
        android:layout_height="match_parent"
        android:layout_gravity="right"
        android:background="#62dec9">

        <ImageView
            android:id="@+id/p_pic"
            android:layout_width="72dp"
            android:layout_height="72dp"
            android:layout_centerInParent="true"
            android:src="@drawable/ic_action_user"/>

        <TextView
            android:id="@+id/right_textview"
            android:layout_width="wrap_content"
            android:layout_height="48dp"
            android:layout_below="@id/p_pic"
            android:layout_centerHorizontal="true"
            android:layout_marginTop="12dp"
            android:text="个人中心"
            android:textColor="@android:color/black"
            android:textSize="14sp"/>
    </RelativeLayout>

</android.support.v4.widget.DrawerLayout>

首先,根布局就是DrawerLayout,在根布局之后又主要分为三大块(代码中描述了),第一块就是主界面的内容,第二块是左边拉出来的布局,第三块是右边拉出来的布局(一般应用只需要左侧布局)。那么系统怎么知道我们这个布局是主布局还是侧拉菜单的布局?请注意左边侧拉菜单布局android:layout_gravity="left"这个属性和右边菜单布局的android:layout_gravity="right"这个属性,我们必须指定这两个值才可以实现效果,系统通过layout_gravity属性的值来判断这个布局是左边菜单的布局还是右边菜单的布局,如果没有这个属性,只显示主界面的布局。

这个时候,让我们来运行一下程序看看效果:

布局文件写好之后,我们的侧拉效果其实就已经可以实现了,但是你发现左边拉出来什么东西都没有,那是因为还没有数据,所以我们要在MainActivity中初始化左边布局的ListView,给ListView赋值简直不能再简单的了,直接贴代码吧:

modeo类:

package com.itydl.drawerlayoutdemo;

public class ContentModel {private int imageView;
   private String text;
   private int id;

   public int getId() {return id;
   }public void setId(int id) {this.id = id;
   }public ContentModel() {}public ContentModel(int imageView, String text, int id) {this.imageView = imageView;
      this.text = text;
      this.id = id;
   }public int getImageView() {return imageView;
   }public void setImageView(int imageView) {this.imageView = imageView;
   }public String getText() {return text;
   }public void setText(String text) {this.text = text;
   }}

Adapter适配器:

package com.itydl.drawerlayoutdemo;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;

import java.util.List;

public class ContentAdapter extends BaseAdapter {private Context context;
   private List<ContentModel> list;

   public ContentAdapter(Context context, List<ContentModel> list) {super();
      this.context = context;
      this.list = list;
   }@Override
   public int getCount() {if (list != null) {return list.size();
      }return 0;
   }@Override
   public Object getItem(int position) {if (list != null) {return list.get(position);
      }return null;
   }@Override
   public long getItemId(int position) {return list.get(position).getId();
   }@Override
   public View getView(int position, View convertView, ViewGroup parent) {ViewHold hold;
      if (convertView == null) {hold = new ViewHold();
         convertView = LayoutInflater.from(context).inflate(R.layout.content_item, null);
         convertView.setTag(hold);
      } else {hold = (ViewHold) convertView.getTag();
      }hold.imageView = (ImageView) convertView.findViewById(R.id.item_imageview);
      hold.textView = (TextView) convertView.findViewById(R.id.item_textview);

      hold.imageView.setImageResource(list.get(position).getImageView());
      hold.textView.setText(list.get(position).getText());
      return convertView;
   }class ViewHold {public ImageView imageView;
      public TextView textView;
   }}  

ListView子项布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal"
    android:paddingTop="20dp"
    android:paddingBottom="20dp"
    android:gravity="center">

    <ImageView
        android:id="@+id/item_imageview"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/ic_launcher"/>

    <TextView
        android:id="@+id/item_textview"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="aa"
        android:textSize="20dp"/>

</LinearLayout>

主活动代码。

public class MainActivity extends AppCompatActivity {private List<ContentModel> mList = new ArrayList<ContentModel>();;
    private ListView mListView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initData();

        mListView = (ListView) findViewById(R.id.left_listview);
        ContentAdapter adapter = new ContentAdapter(this,mList);
        mListView.setAdapter(adapter);

    }private void initData() {mList.add(new ContentModel(R.drawable.doctoradvice2, "新闻", 1));
        mList.add(new ContentModel(R.drawable.infusion_selected, "订阅", 2));
        mList.add(new ContentModel(R.drawable.mypatient_selected, "图片", 3));
        mList.add(new ContentModel(R.drawable.mywork_selected, "视频", 4));
        mList.add(new ContentModel(R.drawable.nursingcareplan2, "跟帖", 5));
        mList.add(new ContentModel(R.drawable.personal_selected, "投票", 6));
    }
}

以上操作十分简单,就不想多做口舌了~

好了,给左边的侧拉菜单中的ListView赋值之后,把它拉出来,这下就全都有数据了。我们可以运行看看效果了:

模拟器运行测拉并不好控制,真机测试是比较完美的。同时,我们看到标题栏上边我加了一个按钮,那么我们能不能点击让左侧菜单拉出来呢?还有,我能不能给左侧的每一项item加上点击事假呢?答案是肯定的,最后,就让我们实现点击打开测拉菜单,以及实现左侧测拉菜单item的点击事件吧、

首先通过点击menu打开左侧边栏,点击个人图片打开个人中心。我们只需要给按钮添加点击事件就可以了:

menu事件

findViewById(R.id.leftmenu).setOnClickListener(new View.OnClickListener() {@Override
    public void onClick(View v) {mDrawerLayout.openDrawer(Gravity.LEFT);
    }
});

个人事件:

findViewById(R.id.rightmenu).setOnClickListener(new View.OnClickListener() {@Override
    public void onClick(View v) {mDrawerLayout.openDrawer(Gravity.RIGHT);
    }
});

其实很简单,直接调用DrawerLayout的openDrawer方法,参数传Gravity.LEFT表示让左边的侧拉菜单出来,参数如果传Gravity.RIGHT,则表示让右边的侧拉菜单出来。

完成了点击事件,我们就要想着点击item后要处理的事件了:

在这里再加入点击按钮切换指定页面的功能。即当我点击“新闻”,主界面显示新闻内容,当我点击”订阅“,主界面显示订阅的内容。这个也很好实现,首先,点击事件不用说,就是ListView的setOnItemClickListener,点击之后,我们的主界面会显示相应的Fragment。即,如果点击了新闻,则主界面显示新闻的Fragment,如果点击了订阅,则主界面显示订阅的Fragment,代码写了出来

mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {@Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {switch (position) {//模拟两条数据

            case 0://新闻
                //切换新闻的Fragment
                replaceFragment(new NewsFargment());
                break;
            case 1://订阅
                //切换订阅的Fragment
                replaceFragment(new SubscibeFragment());
                break;

            default:break;
            }//点击任一项item项,都关闭左侧菜单
        mDrawerLayout.closeDrawer(Gravity.LEFT);
    }
});

因为多个地方会用到切换Fragment,因此我又把这个功能封装了一个公共方法

public void replaceFragment(Fragment fragment){//1、拿到FragmentManager管理器
    FragmentManager manager = getSupportFragmentManager();

    //2、获取事物
    FragmentTransaction transaction = manager.beginTransaction();

    //3、fragment的替换
    transaction.replace(R.id.content,fragment);

    //4、提交事物
    transaction.commit();
}

每次点击之后,就用相应的Fragment替换主界面的LinearLayout,当然,替换完成之后要记得关闭左边的侧拉菜单,传入的参数为Gravity.LEFT表示关闭左边的侧拉菜单,如果传入的菜单为Gravity.RIGHT表示关闭右边的侧拉菜单。这里两个Fragment都太简单了,我就不贴源码了。

我们还可以针对左侧测拉布局做一些效果,比如说是,点击选中色,不点击为默认色。以及加入一些其它的更绚丽的设置等。我这里就做简单的设置。更多的效果,大家可根据自己兴趣来。

针对这个需求我加入了下面的代码:

/**切换listview的item背景色,选中为红色;否则为黑色的方式二。当点击item的时候,就会触发子项item的焦点*/
mListView.setOnFocusChangeListener(new View.OnFocusChangeListener() {@Override
    public void onFocusChange(View v, boolean hasFocus) {if(hasFocus == true){//获得焦点
            mListView.setSelector(android.R.color.holo_red_light) ;
        }   else{//失去焦点
            mListView.setSelector(android.R.color.black) ;
        }}
});

项目开发完毕了,咱们来看看最终效果吧:

模仿网易新闻客户端测拉框架完毕,喜欢我的朋友可以关注我。

本文参考博客:1、http://blog.csdn.net/u012702547/article/details/49562747

2、http://www.cnblogs.com/mengdd/p/3213378.html

也可以打开微信搜索公众号  Android程序员开发指南  或者手机扫描下方二维码 在公众号Android文章。

微信公众号图片:

Android Studio精彩案例(四)《DrawerLayout使用详解仿网易新闻客户端侧边栏 》相关推荐

  1. Android 开源框架ViewPageIndicator 和 ViewPager 仿网易新闻客户端Tab标签

     转载请注明出处:http://blog.csdn.net/xiaanming/article/details/10766053 之前用JakeWharton的开源框架ActionBarSherl ...

  2. android分类功能,Android 仿网易新闻客户端分类排序功能

    先来看看网易新闻客户端以及自己实现的效果图,效果当然还是网易的好 gridviewsort.gif 如何实现拖拽一个Item 用WindowManager添加一个ImageView,并且将这个Imag ...

  3. Android高仿网易新闻客户端之动态添加标签

    承接上一篇文章:Android高仿网易新闻客户端之首页,今天来实现动态添加标签效果. 动态标签页是一个流式布局,实现了宽度自动换行高度自动分配的功能,代码如下: FlowLayout.java pac ...

  4. android 仿网易标签切换,Android 仿网易新闻客户端Tab标签

    Android 开源框架ViewPageIndicator和ViewPager仿网易新闻客户端Tab标签 http://blog.csdn.net/xiaanming/article/details/ ...

  5. android 仿网易新闻客户端源码都有

    原文:android 仿网易新闻客户端源码都有 android 仿网易新闻服务端源码 源代码下载地址: http://www.zuidaima.com/share/1550463560944640.h ...

  6. Android高仿网易新闻客户端之首页

    关于实现网易新闻客户端的界面,以前写过很多博客,请参考: Android实现网易新闻客户端效果 Android实现网易新闻客户端侧滑菜单(一) Android实现网易新闻客户端侧滑菜单(二) 今天用V ...

  7. android 高仿网易新闻,Android高仿网易新闻客户端

    关于实现网易新闻客户端的界面,以前写过很多博客,请参考: 今天用ViewPager + FragmentAdapter + ViewPagerIndicator来实现. ViewPagerIndica ...

  8. Toolbar+DrawerLayout高仿网易新闻客户端

    首先看效果图,网易新闻客户端的特点是双向侧滑,并且左上角的图标会随着菜单的侧滑会有动画效果. 我们采用Toolbar和DrawerLayout实现双向侧滑以及actionbar 在菜单文件里先定义菜单 ...

  9. Android SlidingMenu 仿网易新闻客户端布局

    前面两篇文章中的SlidingMenu都出现在左侧,今天来模仿一下网易新闻客户端左右两边都有SlidingMenu的效果,以下是网易新闻客户端效果: 不扯闲话了,直接进入正题吧 frame_conte ...

最新文章

  1. 你哪来这么多事(大结局):职工信息删除
  2. 虚拟机桌面linux系统,KVM - Linux下三大免费桌面虚拟机评测_Linux教程_Linux公社-Linux系统门户网站...
  3. TreeView复选框选择逻辑判断
  4. 六边形溯源追踪算法编程思想与代码
  5. QT中添加背景图片,颜色,以及字体等
  6. Java Web -【分页功能】详解
  7. C语言再学习 -- 结构和其他数据形式
  8. 一个算法对于某个输入的循环次数是可以事先估计出来的_结合各路博客的EM算法理解...
  9. [转]语音报警.NET开发初探
  10. JS入门之Date对象
  11. ruby 数据sql操作
  12. JAVA进阶教学之(Enum枚举类)
  13. 我的QT5学习之路(目录)
  14. nodejs 前端 返回数组给_互联网寒冬,一年经验字节跳动、虾皮、快手、拼多多前端面试总结...
  15. 卸载驱动、安装CUDA及CUDNN
  16. 【Java】 类和对象
  17. win10远程连接ubuntu18.4
  18. 第四届全国大学生GIS应用技能大赛试题参考答案(上午第2套)
  19. docker镜像与容器基本的基本操作
  20. 魅族的usb计算机连接无法使用,魅族16怎么连接电脑 魅族手机连接电脑无法识别...

热门文章

  1. 冷链物流从业人员最常使用的劳保防护用品有哪些?
  2. Android微信登录以及分享集成步骤
  3. PS 蒙版实现图片融合
  4. xlsx如何查找替换_exc-excel里的查找和替换怎么用在excel – 手机爱问
  5. 医院计算机怎么评职称,医院设备科主要是干什么的?医院设备科怎么评职称?...
  6. CentOS7.9 EDA软件V3.0,Cadence、Synopsys、Mentor、Ansys、Keysight、Matlab、Vivado和Quartus等工具虚拟机平台
  7. 拉姆.查兰管理实践奖2018:新经济的“瞻前顾后”
  8. html5专题总结报告,html5最全总结.doc
  9. 用什么软件测试卡琪丽口红的真假,化妆品TOM FORD(TF)口红真假鉴别方法
  10. 如何识别服务器的操作系统