Android N Settings模块与Android M Settings模块差异
来源:互联网 发布:软件资质 公司 编辑:程序博客网 时间:2024/06/04 18:23
Android N Settings 与之前的Android版本Settings模块在UI上右较大的改变,最直观的差异在于Android N 设置界面增加了向右滑动的抽屉效果。
先回想下android M设置的主界面时怎么显示和交互的?
android M设置的主界面是定义在res/xml/dashboard_categories.xml这个文件中,其SettingsActivity.java继承与Activity,在其onCreate方法中,通过mIsShowingDashboard变量,控制加载不同的布局R.layout.settings_main_dashboard或者R.layout.settings_main_prefs(Settings的主界面或者二级三级菜单),mIsShowingDashboard Boolear类型的变量是直接判断当前要启动的Activity的类是不是Settings.class,因为Settings这个类才是Settings的入口类。若是加载Settings的主界面,则是加载R.layout.settings_main_dashboard布局,这个布局里面仅仅只是一个FrameLayout的ViewContainer。
SettingsActivity.java中buildDashboardCategories()->loadCategoriesFromResource(R.xml.dashboard_categories, categories, this) ->updateTilesList()去解析这个布局文件,动态添加或删除一级菜单的item,然后将主界面加载到FrameLayout的ViewContainer中,这样一级菜单就显示出来了。
对于二级菜单,在设置模块中有一个Settings.java的类,该类中定义了许多直接继承与SettingsActivity的空实现Activity,如果细心点还会发现,这些空实现的Activity在AndroidMainifest.xml中都有<meta-data/>属性,这是为什么呢?原因很简单,上面说过,既然这些Activity都是继承与SettingsActivity,那么要启动这些Activity时必然会走SettingsActivity中onCreate()方法,刚在还提到SettingsActivity中onCreate()方法是需要加载一级菜单还是加载二级菜单,取决于mIsShowingDashboard变量,而现在要确定加载的是二级菜单的具体哪个菜单?则需要用到AndroidMainifest.xml中声明该Activity时定义的<meta-data/>属性。
当然,并不是所有的设置项都是这样,例如若要在Settings中添加一个选项,跳转到其他应用中,那么也可以直接在dashboard_categories.xml中添加相应的item,直接用intent跳转过去也时可以的。
那么,Android N中的设置主界面又时怎么显示和交互的呢?
Android N 在代码架构上和Android M最大的区别是Android N设置代码分为了两部分,一部分是在packages/apps/Settings,另一部分是在frameworks/base/packages/SettingsLib。
Android N Settings增加了向右滑动的抽屉效果,即无论在一级二级还是三级菜单界面下,只要向右滑动就可以调出Settings的主界面(事实上是无论哪一级菜单,只要改级菜单继承了SettingsActivity,那么就可以向右滑动调出设置的主界面)。接下来分析Android N Settings的启动流程。
先看设置的入口类,Settings.java,该类和之前一样,没什么变化,一样继承与SettingsActivity.java,内部也定义了很多空实现的内部类,空Activity继承与SettingsActivity。那么应该和android M一样,真正的入口还是在SettingsActivity中。直接看SettingsActivity类,发现SettingsActivity不再是继承与Activity类,而是继承与rameworks/base/packages/SettingsLib下面的SettingsDrawerActivity,看一下SettingsDrawerActivity是什么鬼??
SettingsDrawerActivity从名字来看,好像和实现滑动效果有关,到该类一看究竟,发现它加载的布局时settings_with_drawer.xml,这个布局中用到android.support.v4.widget.DrawerLayout,DrawerLayout布局就具有左右滑动的抽屉效果。在看settings_with_drawer.xml布局中有一个listView控件,猜想该控件就是用来显示抽屉布局中的设置的主界面(后面在分析)。
继续看SettingsActivity的onCreate方法,其加载布局的地方和之前没什么区别,可是却发现有区别的地方在从DashboardSummary.class中的获取要加载item的数据部分,DashboardSummary.java的rebuildUI()中,调用了SettingsDrawerActivity的getDashboardCategories()获取数据。也就是说在设置中主界面上要显示那些选项也是rameworks/base/packages/SettingsLib中的SettingsDrawerActivity的getDashboardCategories()获取来的,而不是像Android M一样将布局定义在res/xml/dashboard_categories.xml,现在在Settings模块下面已经没有了dashboard_categories.xml文件,那么数据到底是怎么获取出来的呢?
现在来分析SettingsDrawerActivity类,在SettingsDrawerActivity的onCreate方法中,如上面提到,它加载的布局是settings_with_drawer.xml,它是外层是DrawerLayout,所以能左右滑动(可自行百度DrawerLayout用法),该布局中有listView,这个listView就是我们左右滑动看到的DrawerLayout的主界面,listView的Adapter是SettingsDrawerAdapter的实例,SettingsDrawerAdapter继承于BaseAdapter,SettingsDrawerActivity中通过getDashboardCategories() >TileUtils.getCategories(this, sTileCache),获取的数据,它将数据也是封装成DashboardCategory类型。
再来看 TileUtils类的getCategories()是如何返回DashboardCategory对象的List的?先看代码:
getCategories()方法差不多可分为三步:
1.先调用getTilesForAction() ->getTilesForInten()从AndroidMainifast.xml中声明的activity信息中解析,并将解析的数据以Tile类型数据结构封装。
2,遍历存储所有Tile的集合,将通过tile.category属性,将其分类,并构建成category,并将category存储在对应的categoryMap中。
3.构建categories,并且排序,排序是按照DashboardCategory的priority排序的。
先看一下Title数据类型,它里面封装的每一个变量都是和AndroidMainifast.xml中声明Activity时<meta-data/>标签一一对应的。
Title : 对应每个item显示的标题
icon :对应每个Item显示的图标
summary : 对应每个item显示的详细信息,summary
intent :item 对应的intent
cetagory :item 属于哪一个catagory
priority : item 的位置有关,排序会用到
extras :Optional additional data for use by subclasses of the activity,从启动它的类携带过来的信息
meta-data :The metaData from the activity that defines this tile,定义的meta-data
通过这样的方法获取到了Settings主菜单和左后滑动抽屉效果需要显示的数据,然后将数据抛给SettingsDrawerAdapter,在它的getView方法中去创建对应的view,就将界面展示出来了。
总结一下:到了Android N设置中没有主界面显示的布局文件,而是直接解析AndroidManifast.xml文件,从该文件中获得并处理要显示的信息。
- Android N Settings模块与Android M Settings模块差异
- Android Settings模块分析
- Android Settings模块分析
- Android Settings模块分析
- 浅谈Android Settings模块架构
- Android系统Settings设置模块
- framework 与 Settings 模块
- Android Settings模块架构浅析<1>
- Android 5.1 Settings模块源码分析
- 原生android中Settings模块添加步骤
- android settings---------Settings.java
- WINDOWS下ECLIPSE ANDROID源码SETTINGS模块调试
- android settings模块中添加来电反转静音功能
- Windows下Eclipse Android源码Settings模块调试
- google settings存储模块
- Android Settings
- android - Settings
- Android 7.0(N) Settings 修改Icon 与侧拉栏不同步问题
- 函数的范例
- 基于Android的OpenGL ES 2.0学习笔记(2)
- 51nod 1418 放球游戏
- PCM、WAV格式介绍及用C语言实现PCM转WAV
- 初识Python面向对象,父类与子类(继承),例子详解
- Android N Settings模块与Android M Settings模块差异
- codeforces 733D (水题)
- CUDA8.0thrust编程报错
- 最简单的mybatis
- C# Win32API 模拟鼠标移动及点击事件
- Given n pairs of parentheses, write a function to generate all combinations of well-formed parenthe
- rman blockrecover ORA-600 [kcrrge.cannotread_inc.1] oracle bug 处理方式
- 程序员遇到bug怎么面对?
- 11.2编程总结