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

在Android4.0中Contacts添加联系人界面分析(源码)

2014-03-25 14:31 501 查看
一说到Contacts,那么最直接的就是怎样添加联系人?下面将从Android4.0代码的角度上描述一下增加联系人界面的初始化工作。请大家不要轻视这个初始化,因为其并不是想象中的setContentView就结束了的事。欲知详情,请听我详细道来。

增加联系人界面的显示如下(图1,图2)





图1 增加联系人界面1





图2 增加联系人界面2

看到上面的界面,您或许会想,也没啥嘛!我也不多说,一会您就知道了。

通过ActivityManager的跳转log,我们很容易找到跳转到的页面是ContactEditorActivity。

在onCreate方法中,看到setContentView(R.layout.contact_editor_activity),您可能会想到,这和我刚说的好像不一样啊,这不是就通过setContentView方法设置界面的嘛,请跟我继续看。contact_editor_activity.xml中只有ScrollView和一个fragment两个组件,看样子应该在fragment中。进入ContactEditorFragment,找到该类的onCreateView方法,首先引起我们注意的肯定是final
View view = inflater.inflate(R.layout.contact_editor_fragment, container, false),顺藤摸瓜,我们看看contact_editor_fragment.xml是否有什么神秘的地方?布局很简单,外面一个FrameLayout,包裹这一个ScrollView和一个id叫做editors的LinearLayout,看样子,应该是动态绑定的,看代码,在onCreateView的第二行,见到了如下的语句, mContent
= (LinearLayout) view.findViewById(R.id.editors),啥也不用说,继续,哈哈,在onCreate方法中,我们看到了bindEditors()的身影。下面我们来看看是否有什么收获,引起我注意的就是mContent对象(对应于布局中的线性布局editors),在该方法中第一个注意点是mContent.removeAllViews(),也就是将线性布局中的对象全部移除,看样子接下来就是动态绑定了,接下来,看到下面的1句,final
LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE),就更加坚定了我的想法,好,再往下就跟账户类型又关了,在往下,见到曙光了

final BaseRawContactEditorView editor;

if (!type.areContactsWritable())
{

editor = (BaseRawContactEditorView) inflater.inflate(

R.layout.raw_contact_readonly_editor_view,
mContent, false);

((RawContactReadOnlyEditorView) editor).setListener(this);

} else {

editor=(RawContactEditorView) inflater.inflate(R.layout.raw_contact_editor_view,

mContent,
false);

}

看样子是根据账户的类型,是否可以,然后加载不同的布局,通过log会发现,正常的情况下,添加联系人的情况type.areContactsWritable()都是true,也就是加载else语句所示的文件,我们先看看该文件,首先跟标签是com.android.contacts.editor.RawContactEditorView一个自定义的线性布局。感觉这个文件差不多,应该是需求的页面,但是看来看去,似乎只是一个头部(下图3)和一个按钮,总感觉好像少了些什么,看样子肯定也是动态加载了布局实现的。sect_fields,证明了我的想法。至于为什么raw_contact_editor_view.xml只是构造了上面的这一部分,布局文件虽然不停地在嵌套,但我不做过多的解释,只要沿着一条路向下看就知道了。没有什么分支,比较简单。





图3 增加联系人上半部分

下面主要描述一下中间部分是如何动态出现的。

找到RawContactEditorView.java类,onFinishInflate()方法中,我们找到了mFields =
(ViewGroup)findViewById(R.id.sect_fields),到此为止,又不知道怎么走了,虽然直接收缩可以看到调用mFields的地方有好多处,不知道什么地方是个头,那么我们做程序员的在这个时候可不能犯懒,回过头来想想,我们是否是忘了什么?在ContactEditorFragment类的bindEditors方法,我们似乎没看到,只看到加载布局文件到mContent(线性布局)中,就没有往下看了,会去看看,应该有所发现的editor.setState(entity,
type, mViewIdGenerator, isEditingUserProfile()),通过代码可以知道,这里面的editor就是RawContactEditorView类的对象,入口找到了,就是RawContactEditorView类的setState方法。

在该方法中,首先有mFields.removeAllViews(),将布局中的view全部清除掉,

然后初始化及处理mGroupMembershipView对象,该对象对应于Group的按钮。

Section对象,organizationView对象等等。

由于时间关系,有很多地方描述的不够详细,也不够透彻,有些地方,还的确需要朋友们自己去跟一遍甚至多遍代码,要不然很难走同,老弟就偷个心静,不再废话了。

但愿小弟的总结,能未诸位朋友带来一点帮助!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: