您的位置:首页 > 移动开发 > Android开发

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字母排列(有需要的自己去看一下,实现过程很简单)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: