前文链接:开源中国源码学习UI篇(一)之FragmentTabHost的使用分析

    开源中国2.2版,完整源码地址为:http://git.oschina.net/oschina/android-app/tree/v2.2/今天来复习回忆NavigationDrawer和ViewPager分别结合Fragment的使用方式。

1、编写基类

NavigationDrawer即抽屉导航,就是在界面中侧面划出的那部分,我们先来定义BaseFragment,这是为了将常用的代码写到这里,增强代码的复用。


public class BaseFragment extends Fragment implements OnClickListener {protected LayoutInflater mInflater;public AppContext getApplication() {return (AppContext) getActivity().getApplication();}@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {this.mInflater = inflater;View view = super.onCreateView(inflater, container, savedInstanceState); return view;}@Overridepublic View getView() {// TODO Auto-generated method stubreturn super.getView();}
}

2、布局文件---foot、items、整体

1)fragment_navigation_drawer_items---抽屉的每条详细数据

在布局文件中,可以多多使用style,个人理解就是对窗体元素的属性设置进行统一保存,当存在大量重复的属性时,使用style可以很好的减少重复代码的使用。我们这里,抽屉布局有四个item,每个item的显示外观形式是一样的,可以很好地使用style。

线性布局线面的1px的view,充当抽屉里每个item的分界线。

<pre name="code" class="html"> <LinearLayoutandroid:id="@+id/menu_item_quests"style="@style/MenuItemLayoutStyle" ><ImageViewstyle="@style/MenuItemImageViewStyle"android:background="@drawable/drawer_menu_icon_quest"android:contentDescription="@null" /><TextViewstyle="@style/MenuItemTextViewStyle"android:gravity="center"android:text="技术问答" /></LinearLayout><Viewandroid:layout_width="match_parent"android:layout_height="1px"android:background="#d2d2d2" />

下面是,对应的style具体的配置,styles.xml的位置为res/values/styles.xml,

 <!-- 菜单layout的样式 --><style name="MenuItemLayoutStyle"><item name="android:layout_width">match_parent</item><item name="android:layout_height">wrap_content</item><item name="android:minHeight">55dip</item><item name="android:gravity">center_vertical</item><item name="android:orientation">horizontal</item><item name="android:paddingLeft">15dip</item><item name="android:paddingRight">15dip</item><item name="android:background">@drawable/drawer_menu_item_background</item></style><!-- 菜单ImageView的样式 --><style name="MenuItemImageViewStyle"><item name="android:layout_width">24dip</item><item name="android:layout_height">24dip</item><item name="android:layout_marginRight">15dip</item></style><!-- 菜单TextView的样式 --><style name="MenuItemTextViewStyle"><item name="android:layout_width">wrap_content</item><item name="android:layout_height">wrap_content</item><item name="android:textColor">@color/drawer_menu_text</item><item name="android:drawablePadding">10.0dip</item><item name="android:textSize">16.0dp</item></style>

2)fragment_navigation_drawer_foot---抽屉位于底部的设置和退出按钮

整体就是,于抽屉底部对其的线性布局,里面有两个水平分布的子线性布局。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_gravity="bottom"android:baselineAligned="false"android:layout_marginBottom="5dip"android:orientation="horizontal" ><LinearLayoutandroid:id="@+id/menu_item_setting"android:layout_width="0dip"android:layout_height="wrap_content"android:layout_margin="5dip"android:layout_weight="1"android:gravity="center"android:orientation="horizontal" ><ImageViewstyle="@style/MenuItemImageViewStyle"android:background="@drawable/drawer_menu_icon_setting" /><TextViewstyle="@style/MenuItemTextViewStyle"android:textSize="14.0dip"android:text="设置" /></LinearLayout><LinearLayoutandroid:id="@+id/menu_item_exit"android:layout_width="0dip"android:layout_height="wrap_content"android:layout_margin="5dip"android:layout_weight="1"android:gravity="center"android:orientation="horizontal" ><ImageViewstyle="@style/MenuItemImageViewStyle"android:background="@drawable/drawer_menu_icon_exit" /><TextViewstyle="@style/MenuItemTextViewStyle"android:textSize="14.0dp"android:text="退出" /></LinearLayout></LinearLayout>

3)fragment_navigation_drawer---将抽屉的items和foot结合到一起

需要注意的是,通过include语句将前面两个布局文件整合到此,CustomerScrollView是自定义的继承ScrollView的窗体类,使得拖动拥有更好的效果,这里可以用Android自带的ScrollView代替,有关CustomerScrollView的代码,这里不再分析,有兴趣的话,可以在下面的源码demo中查阅。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"android:background="#e2e2e2" ><com.example.testui.widget.CustomerScrollViewandroid:layout_width="match_parent"android:layout_height="0dip"android:layout_weight="1"><include layout="@layout/fragment_navigation_drawer_items"/></com.example.testui.widget.CustomerScrollView ><include layout="@layout/fragment_navigation_drawer_foot"/></LinearLayout>

3、NavigationDrawerFragment---抽屉界面的相关配置

NavigationDrawerFragment继承自之前编写的BaseFragment,定义声明drawer中出现的控件后,重写onCreateView(),其他函数不是显示抽屉必要的。

@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {//fragment_navigation_drawer为layout文件mDrawerListView = inflater.inflate(R.layout.fragment_navigation_drawer, container,false);mDrawerListView.setOnClickListener(this);//butterKnife声明ButterKnife.inject(this,mDrawerListView);//定义各个button的触发单击事件initView(mDrawerListView);//暂时没用initData();return mDrawerListView;}

在主界面activity_main.xml中添加此drawerFragment

注意,android:name属性为刚才建的NavigationDrawerFragment,而tools:layout为对应的布局文件。

<!-- 左侧侧滑菜单 --><fragmentandroid:id="@+id/navigation_drawer"android:name="com.example.testui.ui.fragment.NavigationDrawerFragment"android:layout_width="240dp"android:layout_height="match_parent"android:layout_gravity="start"tools:layout="@layout/fragment_navigation_drawer" />

最后在MainActivity.java中调用

mNavigationDrawerFragment = (NavigationDrawerFragment) getSupportFragmentManager().findFragmentById(R.id.navigation_drawer);

4、总结

总结:
  • 设计抽屉的界面(items、foot、前两者整合)
  • 将上面的整合界面,放到由<android.support.v4.widget.DrawerLayout>最外层包裹的主界面中
  • 定义继承Fragment类的抽屉类,在onCreateView()中显示出来
  • 主界面.java一句话调用

demo图片展示,就这一个界面。demo地址开源中国源码学习UI篇(二)之NavigationDrawer+Fragment和ViewPager+Fragment的使用分析。

开源中国源码学习UI篇(二)之NavigationDrawer+Fragment的使用分析相关推荐

  1. 开源中国源码学习UI篇(一)之FragmentTabHost的使用分析

    最近在有意读开源中国的源码来提升Android开发能力,开通博客来提升一下自己的积极性- -我参考的是开源中国2.2版,完整源码地址为http://git.oschina.net/oschina/an ...

  2. 开源中国源码学习(六)——ButterKnife的使用

    本文翻译自 Butter Knife官方网站: ButterKnife 简介 用@Bind给字段进行注释并且Butter Knife会根据给定的View ID去查找并自动转换为与你的layout中相匹 ...

  3. 开源中国源码学习(一)——简介

    前段时间学习了git-osc客户端的源码,感觉收获不少.尽管,代码并未完全吃透,但是,还是尝到了学习源码的甜头. git-osc客户端源码的第一期学习,暂告一段落. git-osc 客户端源码 git ...

  4. 开源中国源码学习笔记

    开源中国项目,看懂了,就能得到很多启发,包括框架.设计模式等等. http://www.oschina.net/question/213217_60071 大总结: [网络框架]    通过OSChi ...

  5. 开源中国源码学习(五)——切换皮肤(日间模式和夜间模式)

    在开源中国客户端源码的侧滑菜单栏里有一个模式切换的选项,可以完成夜间模式和日间模式的相互转换. 一.功能介绍 在侧滑菜单栏里点击日间或者夜间后,客户端的皮肤可以发生变化,来达到保护眼睛的作用. 二.详 ...

  6. 开源中国源码学习(四)——主界面总体认识

    在AppStart中,我们看到在启动动画结束的时候,程序进行了一次redirectTo.完成了如下任务: Intent to LogUploadService Intent to MainActivi ...

  7. VUE源码学习第一篇--前言

    一.目的 前端技术的发展,现在以vue,react,angular为代表的MVVM模式以成为主流,这三个框架大有三分天下之势.react和angular有facebook与谷歌背书,而vue是以一己之 ...

  8. 蚂蚁金服开源-SofaRpc源码学习篇

    大家好,我叫大鸡腿,大家可以关注下我,会持续更新技术文章还有人生感悟,感谢~ 文章目录 官网 基本流程 SofaRpc学习 代码入手 服务端-发布过程 服务端-构造执行链 服务端-注册到注册中心 客户 ...

  9. qt源码学习---QMetaObject(二)

    1.由于QMetaObject依赖于QMetaMethod.QMetaEnum.QMetaProperty.QMetaClassInfo等类,本篇先看下QMetaMethod方法的实现: 2.QMet ...

最新文章

  1. CV 面试问题详解宝典—目标检测篇
  2. 网线传输速度测试_弱电工程CAT5eCAT6CAT6aCAT7网线怎么选择
  3. r - 求平均成绩_2019深圳市公务员考试笔试成绩公布!
  4. 2008R2文件服务器迁移到2012R2
  5. 面试中的那些“坑问题”该如何回答
  6. ES5-拓展 箭头函数的this、this的优先级
  7. 控制器中获取Field值
  8. CCIE理论-第五篇-SDA-2
  9. 《Go程序设计语言》- 第1章:入门
  10. 所需即所获:像 IDE 一样使用 vim
  11. vscode写的html网页中文乱码
  12. python 给qq点赞_Python实现QQ自动点赞
  13. Arduino Uno - 控制4位8段共阴极数码管 显示数字
  14. 8-思科防火墙:Cisco ASA uRPF运用
  15. 海康录像机能用别的摄像头吗_海康威视录像机如何添加大华摄像头
  16. 鼠标右键发现“新建功能菜单”不见了的解决方案
  17. 蓝桥杯-决赛A组第九届java
  18. 润乾报表设计器——预览报表问题解决
  19. rp导入图片大小_Axure制作图像的放大与缩小效果的四种方式
  20. 科技幻想(一)——便捷人机交互

热门文章

  1. 个人所得税计算器 微信小程序开发 计算差值方法
  2. 23/09/2022 c语言细节
  3. “超男”改“快乐男”,不“超级”也能“快乐”?
  4. 玉米社:网站seo站内优化技巧有哪些?
  5. JAVA 输入身份证号码进行验证正误,15位转18位,并解析出生日、当前年龄、地区代码、性别
  6. leetcode 883. 三维形体投影面积(python)
  7. 消息中间件 RocketMQ的单机安装
  8. 【D3.js数据可视化系列教程】(三十四)-- sankey图
  9. [1-6] 把时间当做朋友(李笑来)Chapter 6 【更多思考】 摘录
  10. 电信天翼3G手机ePhone(易丰)E63V不完全攻略