开源中国 OsChina Android 客户端源码分析(2)滑动菜单

1滑动菜单oschina使用了android.support.v4.widget.DrawerLayout,之前没有用过这个控件,百度了下,大致了解如下:

1.1类似与LinearLayout,就是一个布局控件。

1.2使用时,其有两部分组成,主内容VIEW和菜单内容VIEW,并且主内容必须放在菜单内容的前面,才能让DrawerLayout识别谁是菜单的部分,其宽高都需要设置成match_parent。此处的主内容部分是什么?其实就是主界面上的用以显示各个fragment和底部的导航部分,所以oschina就在主界面的布局文件中直接使用了该控件作为最外围的控件。

1.3 DrawerLayout使用必须在API11之上,所有应用的API的minSdkVersion为11。

布局文件fragment_navigation_drawer.xml ,布局整体两大部分: 可以拖拽的net.oschina.app.widget.CustomerScrollView,内部包含具体菜单项的fragment_navigation_drawer_items.xml布局文件和位于菜单底部的用以设置及关闭功能的fragment_navigation_drawer_foot.xml布局文件。

从对布局文件的分析来看,一下几点值得我们学以致用:

1<net.oschina.app.widget.CustomerScrollView 中使用了android:layout_height="0dip" 加android:layout_weight="1"的组合属性,关于android:layout_weight的用法,关键就是在LinearLayout中按比例显示。但是<include layout="@layout/fragment_navigation_drawer_foot"/>中没有同样的设置android:layout_weight属性,这样岂不是让菜单项部分完全占据了整个区域?追踪到fragment_navigation_drawer.xml中,发现只是设置了位于父布局文件的底部这个属性,再加上最外层的LinearLayout的垂直布局的这个属性。,哦,底部在菜单项之后,又强制的位于底部,这样就形成了最后的效果:实现了菜单项部分占据除底部控件之外的所有区域。

2<include>一般两个作用:如果布局文件有公共部分,那么可以提取出来公用,另外一点,良好的编程习惯:模块化,可读性强等等。oschina客户端应区域后者。

3菜单项布局文件中,因为四部分内容宽、高、背景、点击效果等一样,所以就设置并引用了同一个样式,减小了代码的冗余。

<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>

4参考android.support.v4.widget.DrawerLayout的相关博客http://www.cnblogs.com/mengdd/p/3213378.html

5推荐另外一种实现滑动菜单的博客:http://blog.csdn.net/lmj623565791/article/details/36677279

时间: 2024-12-15 10:45:01

开源中国 OsChina Android 客户端源码分析(2)滑动菜单的相关文章

开源中国 OsChina Android 客户端源码分析(9)下载APK功能

源码中用以下载客户端的类为DownloadService,是一个服务.如果你对android服务不够理解的话,建议先查阅下有关服务的知识点.源码分析如下: 1首先我们先来看下该服务中几个重写的方法: 1.1onCreate()中 首先声明了自定义的绑定器对象,并在自定义的绑定器中添加了几个界面可以访问服务的方法,我们发现在这几个方法中,目前实际用到的start()方法用以开始下载APK,其他的没有用到.获取通知管理器.设置服务为 非前台服务.代码注释中,火蚁表明了不确定性. 其实如果将服务设置为

开源中国 OsChina Android 客户端源码分析(12)清理缓存

上一篇中 缓存对象中我们提到了,将对象数据缓存的地方有三个地方,这里我们详细的说下: 1(/data/data/com.xxx.xxx/cache) 应用私有的缓存目录,属于内部缓存,其他应用无法访问,一般存储较小的数据: 2(/mnt/sdcard/android/data/com.xxx.xxx/cache),应用私有的外部缓存目录. 3SD卡下的自定义目录,共用的. 要实现清除缓存,那么首先你需要知道: 1应用是否采用了缓存策略: 2缓存的数据是什么,在哪里进行了缓存? 3缓存大小的计算实

开源中国 OsChina Android 客户端源码分析(10)双击退出程序

在源码中,火蚁完全封装了  双击退出程序的功能 : DoubleClickExitHelper类 该类的源码分析如下: 1  构造函数中传入了 设备上下文,实现退出功能的界面,完成消息处理器的初始化:既然要有提示条,那么也需要一个Toast对象. 2 既然完全封装,那么 我们需要将 按键的事件及按键码传进去,因为界面重写的onKeyDown 事件需要返回一个boolean值,那么在DoubleClickExitHelper类中也自定义了一个返回布尔值的onKeyDown 函数. 3onKeyDo

开源中国 OsChina Android 客户端源码分析(8)数据库Sqlite

1开源中国客户端使用的数据库部分的源码在net.oschina.app.db包下,两个类一个是用于管理数据库的创建类DatabaseHelper,继承SQLiteOpenHelper,另一个是用于数据库的增删改查的工具类NoteDatabase.那么数据库在开源中国源码中哪一模块用到了呢? 便签管理,便签是什么?就是一个记事本的功能o(^▽^)o 2关于SQLiteOpenHelper的使用,自己之前的项目中没有用到过,看了下,这里有个体会:当获取到SQLiteOpenHelper实例,并使用g

开源中国 OsChina Android 客户端源码分析(3)可以拖拽的ScrollView

oschina客户端滑动菜单的View的布局使用了可以拖拽的ScrollView,类文件为CustomerScrollView. 1 我们需要分析下为什么要用ScrollView?用过的其实很容易理解避免其内部的子View的布局较大,在较小设备上无法完全显示. 2实现可拖拽的效果,只是从用户体验角度去考虑的,接下来我们详细分析下其自定义的ScrollView. 2.1拖拽的目标是ScrollView内的菜单的布局View,所以在CustomerScrollView内的onFinishInflat

开源中国 OsChina Android 客户端源码分析(1)启动界面 app_start

1启动界面的布局文件为app_start.xml ,对应的类文件为net.oschina.app 包下的AppStart.java. 2对于布局文件而言,因为只显示一张主题图片,因此布局简单直接设置背景图片.因为是启动界面,启动时会有短暂的卡顿,对于用户而言体验不好,因此在配置文件中自定义了style ,黑色 无标题 全屏(为什么选黑色的呢?是不是因为背景图图片是白的,衬托的更亮白呢?^_^).设置了背景图片和无标题 <style name="Theme.AppStartLoad"

开源中国 OsChina Android 客户端源码分析(4)自定义对话框

OsChina在主界面底部导航处设置了快速操作的对话框,图示: OsChina采用了Dialog的方式实现,有些人可能会用到popupwindow去实现.通过分析其实现原理,来学到对自己有用的东西. 1布局文件,dialog_quick_option.xml,布局代码不难 2自定义了对话框类QuickOptionDialog: 2.1在构造函数中加载了自定义的对话框的布局文件,初始化控件,完成了快速图片按钮的旋转动画(quick_option_close.xml).此处觉得应该把这部分工作放到o

[Android]Volley源码分析(四)

上篇中有提到NetworkDispatcher是通过mNetwork(Network类型)来进行网络访问的,现在来看一下关于Network是如何进行网络访问的. Network部分的类图: Network有一个实现类BasicNetwork,它有一个mHttpStack的属性,实际的网络请求是由这个mHttpStack来进行的,看BasicNetwork的performRequest()方法, 1 @Override 2 public NetworkResponse performRequest

Android IntentService 源码分析

IntentService简介: IntentService是一个通过Context.startService(Intent)启动可以处理异步请求的Service,使用时你只需要继承IntentService和重写其中的onHandleIntent(Intent)方法接收一个Intent对象,该服务会在异步任务完成时自动停止服务. 所有的请求的处理都在IntentService内部工作线程中完成,它们会顺序执行任务(但不会阻塞主线程的执行),某一时刻只能执行一个异步请求. IntnetServi