介绍

因为在项目中需要用到 tab 滑动的效果所以参考了 android 4.0 contacts 的代码实现

 

Contacts 首页分析

首先看下首页的样式


此处需要注意的是上下都是 actionbar,此处是通过在 AndroidManifest.xml 中对PeopleActivity设置了 android.uiOptions=”splitActionBarWhenNarrow” 来达到的效果。

 

首页的显示是 PeopleActivity.java 这个来负责的。另外一个关键的类是ActionbarAdapter.java,下面针对于这两个类来展开介绍。


 

PeopleActivity.java

具体的作用是:负责管理显示内嵌的fragment和view,此处需要考虑的是这个 activity 支持横竖屏两种显示模式,通过加载不同的layout 来实现不同屏幕上的显示效果。

 

关键变量

DefaultContactBrowseListFragmentmAllFragment - 所有联系人

ContactTileListFragment mFavoritesFragment- 我的最爱联系人

ContactTileFrequentFragmentmFrequentFragment - 2 panel 的时候显示

GroupBrowseListFragment mGroupsFragment - 组联系人

ContactsUnavailableFragmentmContactsUnavailableFragment - 表示当前不可用的 fragment,通过 set 不同的 text 来达到显示不同文字的效果

在 PeopleActivity.onAttachFragment() 中安装了 listener

 

TabPagerAdapter mTabPagerAdapter - 用来放置每个fragment

TabPagerListener mTabPagerListener - 用来监听 tag 的 scroll 和 select 的事件

显示

显示的流程

onCreate() 流程如下:

onCreate() -> createViewsAndFragments()-> invalidateOptionsMenuIfNeeded()

该流程只是创建了需要显示的 fragment(或者 view)和 menu,此时并没有显示出来。

 

onResume () 流程如下:

onResume() ->showContactsUnavailableFragmentIfNecessary() -> updateFragmentsVisibility()

判断正常显示,还是显示没有联系人数据时候的那个 fragment(mContactsUnavailableFragment)

 

showContactsUnavailableFragmentIfNecessary():根据 provider 的状态来决定是否要显示unavailable fragment

updateFragmentsVisibility():根据不同的模式(search/不是 search)来显示 fragment 和 view

 

onNewIntent () 流程如下:

onNewIntent() ->mActionBarAdapter.initialize() -> configureFragments() ->invalidateOptionsMenuIfNeeded()

这个流程主要是考虑的该 activity 被其他 activity 调用的时候该如何显示,因为可能会有 search 的请求所以此处还需要对 actionbar 做一次初始化的动作。

 

configureFragments():根据不同的request 的 action key 来显示(查询)不同的内容

 

TabPager 需要注意的地方

mTabPager.setAdapter(mTabPagerAdapter);    // 负责滑动显示

mTabPager.setOnPageChangeListener(mTabPagerListener);   // 负责显示mContactsUnavailableFragment

 

在显示 mContactsUnavailableFragment 的时候是不能滑动的,因为mContactsUnavailableFragment 没有放到 TabPagerAdapter 中,所以不能滑动,只是它在 TabPagerListener 中响应了 select 事件

Menu 的显示

menu 的显示是在 PeopleActivity 中,根据不同的fragment 来显示不同的 menu,此处的 menu 不是在 fragment 中。

大屏和小屏的支持

支持 1 panel 和 2 panel 两种显示方式,主要是通过加载不同目录下的layout 来实现

 

搜索

流程

用户按下 search 键 -> onSearchRequested() -> mActionBarAdapter.setSearchMode()

 

用户输入 search 的内容 -> onAction() -> mActionBarAdapter.getQueryString() ->setQueryTextToFragment() -> mAllFragment.setQueryString()

 

 

其他

用到了 ListPopupWindow

ActionbarAdapter.java

该类是对于 actionbar 的一个简单封装,主要作用如下:

1. actionbar 的显示(groups,all,favorites)

2. search 和非 search view 的模式切换,给外部提供用户输入的 query string

 

关键变量和函数

构造函数ActionbarAdapter()

将 actionbar 根据用户需要变为 tab 或者 navigation 的模式;

初始化 search view

 

initialize()

恢复上一次的状态,例如:是不是在 search 模式,上次选中的 tab 是哪个等

 

MyTabListener

主要是用来响应用户点击 tab 的事件,例如:点击 tab 之后下面的 content view 也需要对应的发生变化

 

因为这个类只是对于 actionbar 的抽象管理,所以此处切换 content 的时候其实是调用的外部的 activity 的方法,因为只有 activity 才能管理 fragment,才能设置哪个 fragment 显示或者不显示,所以此处是一个 callback 的机制。

 

mPrefs

SharedPreference,通过该变量将当前用户选择的 tab 保存起来,下次进入的时候可以显示上次选择的 tab

 

搜索

启动 search 的方式(进入search模式)

1. 当用户在 PeopleActivity 中点击了 search 按钮

2. 当用户在 PeopleActivity 直接开始输入的时候,

进入 search mode, 调用 mActionBarAdapter.setSearchMode(true);

 

search 的内容,来自于两个方面

从 PeopleActivity 传入的 string,此时是用户没有点击 search 按钮而直接输入的时候才会发生该情况,通过 mSearchView.setQuery(query, false); 将用户输入的查询结果放到 searchview 中

 

通过对 search view 安装 setOnQueryTextListener 从而直接获取用户输入的查询内容,此时在 onQueryTextChange()中会调用 onAction() 去通知 PeopleActivity 去做真正的查询,此处也是一个 callback 机制

 

显示

支持单 panel 和双 panel 两个方式的显示,如果是单 panel 则显示图标,如果是双 panel 则 tab 上显示文字

 

在 search 的时候是 navigation mode,在其他时候是 tab mode

ContactsUnavailableFragment.java

没有联系人的时候显示的表示为 "空" 的 fragment

 

该类需要注意的是在调用 setMessageText() 的时候必须判断 mMessageView 是否为空,因为 activity 在 add(replace) fragment 之后对应的 fragment 中的 view 不能保证马上被创建所以需要做一次保护

更多相关文章

  1. (转载)不需要任何权限获得Android设备的唯一ID
  2. android Activity如何横屏显示?如何解决Activity在设置横屏时候会
  3. 安卓控件之文本框(TextView)
  4. 修改android4.2系统源码实现system组和root用户访问sd卡
  5. Android(安卓)4.0 MutliMedia 流程分析
  6. 百度网盘邀请码:还剩三个哦
  7. android 图形系统requestLayout的流程
  8. Android(安卓)博客园客户端 (七)登录功能
  9. Android(安卓)四大组件之Acticity

随机推荐

  1. Android(安卓)studio 无法创建Android项
  2. Android进程通信-AIDL
  3. Android组件----1.文本TextView详解
  4. Android-你所不知道的context
  5. android 事件传递机制
  6. Android(安卓)不明确key时遍历JSONObject
  7. Error running app: Default Activity No
  8. android ubuntu no permissions
  9. android studio快捷键集合
  10. 在Eclipse中安装ADT