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

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

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

a7943d23b88a5389a1ed38cbbb8d7687.png

图1 增加联系人界面1

318b74bbd9822811afad4a32700fe7c7.png

图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),就更加坚定了我的想法,好,再往下就跟账户类型又关了,在往下,见到曙光了

finalBaseRawContactEditorView 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只是构造了上面的这一部分,布局文件虽然不停地在嵌套,但我不做过多的解释,只要沿着一条路向下看就知道了。没有什么分支,比较简单。

8dc5bada9efb7dc8604b21104942a703.png

图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对象等等。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值