一说到Contacts,那么最直接的就是怎样添加联系人?下面将从Android4.0代码的角度上描述一下增加联系人界面的初始化工作。请大家不要轻视这个初始化,因为其并不是想象中的setContentView就结束了的事。欲知详情,请听我详细道来。
增加联系人界面的显示如下(图1,图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的第二行,见到了如下的语句,
finalBaseRawContactEditorView
if(!type.areContactsWritable()){
看样子是根据账户的类型,是否可以,然后加载不同的布局,通过log会发现,正常的情况下,添加联系人的情况type.areContactsWritable()都是true,也就是加载else语句所示的文件,我们先看看该文件,首先跟标签是com.android.contacts.editor.RawContactEditorView一个自定义的线性布局。感觉这个文件差不多,应该是需求的页面,但是看来看去,似乎只是一个头部(下图3)和一个按钮,总感觉好像少了些什么,看样子肯定也是动态加载了布局实现的。sect_fields,证明了我的想法。至于为什么raw_contact_editor_view.xml只是构造了上面的这一部分,布局文件虽然不停地在嵌套,但我不做过多的解释,只要沿着一条路向下看就知道了。没有什么分支,比较简单。
下面主要描述一下中间部分是如何动态出现的。
找到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对象等等。