Android Contacts源码分析二——(PeopleActivity)分析
2014-10-13 16:11
162 查看
本文承接
Android Contacts源码分析
下面我们直接进入PeopleActivity进行分析(请阅读
Android Contacts源码分析
,之后再阅读本文)好了我们正式进军PeopleActivity
还是率先给出源码位置:
SourceCode/packages\apps\ContactsW2014\src\com\android\contacts\activities/PeopleActivity.java
@Override protected void onCreate(Bundle savedState) { ......... createViewsAndFragments(savedState); ............... }
private void createViewsAndFragments(Bundle savedState) { setContentView(R.layout.people_activity); final FragmentManager fragmentManager = getFragmentManager(); final FragmentTransaction transaction = fragmentManager.beginTransaction(); final boolean isUsingTwoPanes = PhoneCapabilityTester.isUsingTwoPanes(this); if (isUsingTwoPanes) { mFavoritesFragment = getFragment(R.id.favorites_fragment); mAllFragment = getFragment(R.id.all_fragment); mGroupsFragment = getFragment(R.id.groups_fragment); } else { mTabPager = getView(R.id.tab_pager); mTabPager.setTouchDisabled(true); mTabPagerAdapter = new TabPagerAdapter(); mTabPager.setAdapter(mTabPagerAdapter); mTabPager.setOnPageChangeListener(mTabPagerListener); final String FAVORITE_TAG = "tab-pager-favorite"; final String ALL_TAG = "tab-pager-all"; final String GROUPS_TAG = "tab-pager-groups"; final String PHONE_TAG = "tab-pager-phone"; mFavoritesFragment = (ContactTileListFragment)fragmentManager.findFragmentByTag(FAVORITE_TAG); mAllFragment = (DefaultContactBrowseListFragment)fragmentManager.findFragmentByTag(ALL_TAG); mGroupsFragment = (GroupBrowseListFragment)fragmentManager.findFragmentByTag(GROUPS_TAG); mPhoneFragment = (PhoneFragment)fragmentManager.findFragmentByTag(PHONE_TAG); if (mFavoritesFragment == null) { mFavoritesFragment = new ContactTileListFragment(); mAllFragment = new DefaultContactBrowseListFragment(); mGroupsFragment = new GroupBrowseListFragment(); mPhoneFragment = new PhoneFragment("phone"); transaction.add(R.id.tab_pager, mFavoritesFragment, FAVORITE_TAG); transaction.add(R.id.tab_pager, mAllFragment, ALL_TAG); transaction.add(R.id.tab_pager, mGroupsFragment, GROUPS_TAG); transaction.add(R.id.tab_pager, mPhoneFragment, PHONE_TAG); }}
通过上面一段代码
我们可以知道PeopleActivity也是有四部分组成(具体见
Android Contacts源码分析配图
)手机
fragmentManager.findFragmentByTag(PHONE_TAG);
群组
fragmentManager.findFragmentByTag(GROUPS_TAG);
我的收藏
fragmentManager.findFragmentByTag(FAVORITE_TAG);
联系人
fragmentManager.findFragmentByTag(ALL_TAG);
同理 ,像我上一篇文章(传送门)所说的一样,首先,这里我们还是以MTK原装系统为案例
各手机厂商作出修改后也只是略有不同,其次这里的findFragmentByTag(PHONE_TAG);等同于上文
new PhoneFragment("phone");
@Override public void onSelectedTabChanged() { ...... if(tab == TabState.PHONE) { if(mCallType.equals("NORMAL")) { Intent intent = new Intent(); intent.setClassName("com.android.contacts", "com.android.contacts.activities.DialtactsActivity"); startActivity(intent); mActionBarAdapter.setCurrentTab(TabState.ALL, false); finish(); }
完成跳转!
这里,继续吐槽MTK。搞什么双向跳转飞机,无端增加加载压力,影响手机使用。所以各大手机厂商一般就修改了该系统
同理,和我上一篇文章一样,我们也是选择其一作为案例
这次,我们把案例瞄准
联系人
fragmentManager.findFragmentByTag(ALL_TAG);
private DefaultContactBrowseListFragment mAllFragment;
mAllFragment = (DefaultContactBrowseListFragment) fragmentManager.findFragmentByTag(ALL_TAG);
那么,我们还是老规矩,先进入DefaultContactBrowseListFragment
SourceCode/packages\apps\ContactsW2014\src\com\android\contacts\list/DefaultContactBrowseListFragment.java
好了,我们继续下一步
@Override protected View inflateView(LayoutInflater inflater, ViewGroup container) { return inflater.inflate(R.layout.contact_list_content, null);} @Override protected void onCreateView(LayoutInflater inflater, ViewGroup container) {super.onCreateView(inflater, container); mAccountFilterHeader = getView().findViewById(R.id.account_filter_header_container); mAccountFilterHeader.setOnClickListener(mFilterHeaderClickListener); mCounterHeaderView = (TextView) getView().findViewById(R.id.contacts_count); total_contacts = inflater.inflate(R.layout.total_contacts, getListView(), false); mTotalContacts = (TextView) total_contacts.findViewById(R.id.totalContactsText); if(total_contacts!=null) { getListView().addFooterView(total_contacts); } ............. }
很明显的发现他的布局界面contact_list_content
SourceCode/packages\apps\ContactsW2014\res\layout/contact_list_content.xml
<LinearLayout> <LinearLayout android:id="@+id/contactListTopBar" > <EditText android:id="@+id/searchContactsEditText"/><span style="white-space:pre"> </span>//搜索联系人输入框 <ImageView android:id="@+id/addContactsImageView"/><span style="white-space:pre"> </span>//添加联系人按钮 </LinearLayout> <include android:id="@+id/account_filter_header_container"<span style="white-space:pre"> </span> layout="@layout/account_filter_header" /><span style="white-space:pre"> </span>//过滤器账户文字TextView <include layout="@layout/wait_cursor"/><span style="white-space:pre"> </span>//显示加载 <FrameLayout> <view class="com.android.contacts.widget.PinnedHeaderListView"<span style="white-space:pre"> </span>//核心联系人界面ListView android:id="@android:id/list" /> <ProgressBar android:id="@+id/search_progress"/> </FrameLayout> <ViewStub android:id="@+id/footer_stub" android:layout="@layout/footer_panel"/> </LinearLayout>
那么至此,我们已经跟踪到了最核心的联系人列表
SourceCode/packages\apps\ContactsW2014\src\com\android\contacts\widget/PinnedHeaderListView.java
还是那句话,此次我们只涉及界面分析,至于具体的数据获取和加载。我以后有时间再做分析
这里重点指出android:id="@+id/account_filter_header_container"
这里实现了搜索的A-Z字母排列(有需要的自己去看一下,实现过程很简单)
相关文章推荐
- Android 5.1 Contacts源码分析(五):PeopleActivity
- Android Contacts源码分析
- Android 5.1 Contacts源码分析(二):Contacts模块主要窗口
- Android 5.0 Contacts源码分析
- android源码分析--Mms、Contacts、Dialer
- Android 5.0 Contacts源码分析
- Android ContactsProvider源码分析
- Android 5.1 Contacts源码分析(四):Contacts模块ListView Adapter结构
- Android 5.1 Contacts源码分析(一):Contacts模块文件结构
- Android Contacts 联系人源码分析
- Android 5.1 Contacts源码分析(三):Contacts模块Fargment结构
- Android 5.0 Contacts源码分析
- Android 4.0 Contacts 通话记录界面的分析(源码)
- Android Contacts 联系人源码分析
- Android IPC 通讯机制源码分析2(转)
- Android IPC 通讯机制源码分析
- android ubuntu9.10 源码的编译 Eclipse工程 Contacts编译 应用加载
- Android 2.1 源码结构分析
- Android framework源码之JNI实现过程分析