`

Android4.0中Contacts拨号盘界面剖析(源码)

 
阅读更多
http://blog.sina.com.cn/s/blog_9f233c070101b2u1.html


上文已经说过拨号界面的分页是怎么实现的,下面我们分三次来分享拨号页面内的每一个页面的具体实现,我们先从拨号盘开始说起。

上文通过在ViewPager的适配器对象中,发现过一下三行代码

private DialpadFragment mDialpadFragment;

private CallLogFragment mCallLogFragment;

private PhoneFavoriteFragment mPhoneFavoriteFragment;

第一行的DialpadFragment就是拨号盘界面

第二行的CallLogFragment就是通话记录页面

第三行的PhoneFavoriteFragment就是收藏界面

本文主要分享“拨号盘界面”,即DialpadFragment.java

1         拨号盘的显示

首先我们先来看看拨号盘的显示样式,4.0中拨号盘的默认显示效果如下图  

     在Android4.0中Contacts拨号盘界面剖析(源码)

                        图1 拨号盘

给我的感觉是整个盘面分成四个部分,

第一部分: title即tab相应的图标

第二部分: editText输入部分

第三部分:拨号盘主界面

第四部分:拨号盘底部控制栏

2. 每一部分的具体实现

2.1 title图标:

如果看了上文,我们就会发现,title实际上是ActionBar中添加的一个tab

而在添加tab时,就已经对该tab进行了setIcon()操作,再次就不再过多的描述了,如果有不太明白的,请查看DialtactsActivity.java文件的setupDialer()方法。

2.2 editText输入部分

此时我们应该注意一下,DialpadFragment类的到底是什么东西?

class DialpadFragment extends Fragment

原来是Fragment,下面我转载了一个经典的Fragment生命周期图片,下图2

                         在Android4.0中Contacts拨号盘界面剖析(源码)
                           图2   Fragment生命周期

通过上图可以发现,加载布局主要是在onCreateView方法中实现的,下面我们进入onCreateView方法,看看这个布局界面是怎么出现的。

  方法第一句

   View fragmentView = inflater.inflate(R.layout.dialpad_fragment, container, false);

来了,原来是dialpad_fragment.xml文件

   在该文件中,下面我讲editText的部分截取出来,共大家分析:

<LinearLayout

        android:id="@+id/digits_container"

        android:layout_width="match_parent"

        android:layout_height="0px"

        android:layout_weight="0.200"

        android:layout_marginTop="@dimen/dialpad_vertical_margin"

        android:gravity="center"

        android:background="@drawable/dialpad_background" >



        <com.android.contacts.dialpad.DigitsEditText

            android:id="@+id/digits"

            android:layout_width="0dip"

            android:layout_weight="1"

            android:layout_height="match_parent"

            android:layout_alignParentLeft="true"

            android:gravity="center"

            android:textAppearance="@style/DialtactsDigitsTextAppearance"

            android:textColor="?android:attr/textColorPrimary"

            android:nextFocusRight="@+id/overflow_menu"

            android:background="@android:color/transparent" />



        <ImageButton

            android:id="@+id/overflow_menu"

            android:layout_width="48dip"

            android:layout_height="match_parent"

            android:layout_alignParentRight="true"

            android:src="@drawable/ic_menu_overflow"

           android:contentDescription="@*android:string/action_menu_overflow_description"

            android:nextFocusLeft="@id/digits"

            android:background="?android:attr/selectableItemBackground"/>



    </LinearLayout>

我将上面的文件,表示的意义用图的形式画出

      在Android4.0中Contacts拨号盘界面剖析(源码)                           

                                  图3 输入框示意图                                           

图中的青色区域代表的就是digits_container,黄色区域代表的是digits,即输入框,红色区域代表的是overflow_menu按钮。

我想您看过上面的布局文件,就会问输入框应该是EditText,而上文的为什么是DigitsEditText?

很明显它们之间是继承关系。下面我们来看啊可能这个DigitsEditText有什么特点?、

代码中对其进行了虚拟键盘的设置,焦点的变换,触摸等几个操作。

对此需要说明的一点是,布局文件中明明有overflow_menu,但是为什么没有显示出来呢?

原来是在onCreateView中对其可见性进行了设置,设置代码如下:

final View overflowMenuButton = fragmentView.findViewById(R.id.overflow_menu);

  if (overflowMenuButton != null) {

     if (ViewConfiguration.get(getActivity()).hasPermanentMenuKey()) {

       overflowMenuButton.setVisibility(View.GONE);

     } else {

       overflowMenuButton.setOnClickListener(this);

    }

}

在这句话上有这样一句注释

Soft menu button should appear only when there's no hardware menu button.

说出了该overflow按钮的显示时间,再次不多废话。



2.3 拨号键盘

拨号键盘对应于dialpad.xml的布局文件

该布局采用了典型的table布局,有兴趣的朋友可以看一下

下面紧取一个按键,进行一下细节的描述,就拿1这个按键为例

<ImageButton android:id="@+id/one" style="@style/DialtactsDialpadButtonStyle"

            android:src="@drawable/dial_num_1"

            android:contentDescription="@string/description_image_button_one" />

首先为该ImageButton设置了一个id ,然后为其设置了style

我们先进入style看看都为ImageButton做了些什么,

<style name="DialtactsDialpadButtonStyle">

        <item name="android:layout_width">0dip</item>

        <item name="android:layout_height">match_parent</item>

        <item name="android:layout_weight">1</item>

        <item name="android:background">?android:attr/selectableItemBackground</item>

        <item name="android:soundEffectsEnabled">false</item>

</style>

最引人注意的是android:background 和android:soundEffectsEnabled

android:background代表着该ImageButton的背景色

android:soundEffectsEnabled设置点击或触摸时是否有声音效果

回过来,我们再来看看ImageButton的前景

android:src="@drawable/dial_num_1"

很显然,这个一个图片嘛,有啥好看的?您不仅会这样想。

实际上这个是一个图片吗?不是,也是,更确切的说是一个图片组,下面我们来看看这个图片组到底有什么神秘的

<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <!-- <item android:state_pressed="true"

        android:drawable="@drawable/dial_num_1" />

    <item android:state_focused="true"

        android:drawable="@drawable/dial_num_1" /> -->

    <item

        android:drawable="@drawable/dial_num_1_wht" />

</selector>

哈哈,原来是个selector,通过其中的条件可以添加点击,触摸等等效果,这个在我们平时开发的过程中还是比较常用的,朋友们一定要记住哦!

2.4拨号盘底部控制栏

通过dialpad_additional_buttons.xml文件查看到,

三个按钮2个分割线的横向布局排列,这个页面没有什么神秘的地方,就不在浪费笔墨了

分享到:
评论

相关推荐

    android4.0 Contacts 联系人jar包

    本资源提供的"android4.0 Contacts 联系人jar包"是Android 4.0系统中用于处理联系人功能的核心库,它包含了与联系人相关的API和类,使得开发者能够更加方便地进行联系人应用的开发。 首先,Android 4.0的Contacts ...

    android4.0联系人Contacts源代码

    Android中的ContentProvider是数据共享的关键组件,Contacts应用通过ContentProvider对外提供联系人数据的增删改查接口。开发者可以通过URI来访问这些接口,实现与其他应用的数据交互。 3. **SQLite数据库** 在...

    android4.0 联系人源码分析

    通过对`PeopleActivity`及其相关组件的源码分析,我们可以深入理解Android 4.0中“Contacts”应用的工作原理。这不仅包括UI布局的设计,还包括Activity生命周期管理、Fragment的使用、事件监听和数据过滤等高级概念...

    Android 多功能拨号盘源码.rar

    通过分析和学习这个Android多功能拨号盘源码,开发者可以深入了解Android应用开发的多个方面,包括UI设计、数据访问、事件处理、系统服务的利用等,这对于提升Android开发技能大有裨益。同时,源码中还可能包含了...

    Android 多功能拨号盘源码.zip

    在Android应用开发中,拨号盘是不可或缺的一部分,它允许用户输入电话号码并进行呼叫操作。本项目"Android 多功能拨号盘源码"提供了一个详细的实现案例,旨在帮助开发者学习和理解如何构建一个自定义、功能丰富的...

    Android制作拨号键盘

    拨号和读取联系人是敏感操作,需要在AndroidManifest.xml文件中声明相应的权限,如 `&lt;uses-permission android:name="android.permission.CALL_PHONE" /&gt;` 和 `&lt;uses-permission android:name="android.permission....

    Android Studio拨号界面.rar

    首先,Intent在Android中扮演着消息对象的角色,用于启动一个Activity或者Service。它是Android组件间通信的重要方式。当我们想要调用系统拨号、联系人或短信界面时,可以通过创建特定的Intent并startActivity()来...

    android Contacts 通讯录源码

    在Android 4.0中,选择联系人通常通过Intent启动Contacts应用的特定界面。这部分源码展示了如何构建和解析Intent,以及如何在不同的Activity之间进行跳转。 8. **性能优化** Contacts应用在处理大量数据时需要...

    Android 5.0拨号盘 Dialer源码

    在Android系统中,拨号盘(Dialer)是用户与...通过分析Android 5.0拨号盘Dialer的源码,我们可以了解到Android系统中电话功能的实现细节,这对于开发者来说,无论是进行应用开发还是系统级优化,都是非常宝贵的知识。

    android4.0 联系人源代码

    1. **数据存储**:在Android中,联系人数据主要存储在SQLite数据库中,通过ContentProvider进行访问。Android 4.0的联系人应用会使用多个表来存储姓名、电话号码、电子邮件地址等不同类型的联系人信息。 2. **...

    安卓Android源码——Contacts.rar

    在深入探讨安卓Android源码中的Contacts部分之前,我们需要先理解Contacts在安卓系统中的重要地位。Contacts是用户管理个人联系人信息的主要应用,它负责存储、显示和操作联系人的姓名、电话号码、电子邮件地址等...

    Android4.4Contacts源码

    4. **UI组件**:Contacts应用的界面构建基于Android的布局和控件,如`ListView`用于展示联系人列表,`RecyclerView`在新版本中替换`ListView`提供了更好的性能和可定制性。`CursorLoader`用于加载数据库查询结果到UI...

    Android应用源码之Contacts.zip项目安卓应用源码下载

    Android应用源码之Contacts.zip项目安卓应用源码下载Android应用源码之Contacts.zip项目安卓应用源码下载 1.适合学生毕业设计研究参考 2.适合个人学习研究参考 3.适合公司开发项目技术参考

    Android 系统应用 Contacts 源码

    在Android系统中,联系人应用Contacts是用户与设备上的联系信息进行交互的主要界面。源码分析可以帮助我们深入了解其内部工作原理,以及如何自定义或优化这个应用。2013年11月份的Contacts源码提供了对Android 4.x...

    Android拨号界面

    在Android系统中,拨号界面是用户与手机通信功能交互的核心部分。它是用户拨打和接听电话的入口,设计简洁易用,集成了多种功能。本文将深入探讨Android拨号界面的相关知识点,包括其组成、功能、自定义以及API的...

    android4.0 电话Phone源代码

    通过对Android 4.0电话Phone模块源代码的分析,我们可以更深入地理解Android系统的电话功能实现,这对于开发者来说,无论是优化现有应用,还是开发新的电话相关功能,都具有重要的参考价值。同时,这些知识也对理解...

    Android 源码分析_Contacts

    在Android系统中,联系人应用(Contacts)是用户与他人通信...通过对Android源码的深入分析,我们可以理解Contacts应用如何高效地管理、显示和操作大量联系人数据,这对于定制化开发或者优化性能有着重要的指导意义。

Global site tag (gtag.js) - Google Analytics