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

private DialpadFragment mDialpadFragment;

private CallLogFragment mCallLogFragment;

private PhoneFavoriteFragment mPhoneFavoriteFragment;

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

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

第三行的PhoneFavoriteFragment就是收藏界面

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

1         拨号盘的显示

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

图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


                           图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>

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

图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拨号盘界面剖析(源码)的更多相关文章

  1. Spark-1.6.0中的Sort Based Shuffle源码解读

    从Spark-1.2.0开始,Spark的Shuffle由Hash Based Shuffle升级成了Sort Based Shuffle.即Spark.shuffle.manager从Hash换成了 ...

  2. Android4.0中蓝牙适配器state machine(状态机)的分析

    今天晓东和大家来一起看一下Android4.0中蓝牙适配器(Bluetooth Adapter)的状态机变化的过程.首先,我们需要了解一下,蓝牙适配器究竟有哪些状态,从代码可以清晰地看到(framew ...

  3. Android菜鸟的成长笔记(6)——剖析源码学自定义主题Theme

    原文:Android菜鸟的成长笔记(6)--剖析源码学自定义主题Theme 还记得在Android菜鸟的成长笔记(3)中我们曾经遇到了一个问题吗?"这个界面和真真的QQ界面还有点不同的就是上 ...

  4. Fabric2.2中的Raft共识模块源码分析

    引言 Hyperledger Fabric是当前比较流行的一种联盟链系统,它隶属于Linux基金会在2015年创建的超级账本项目且是这个项目最重要的一个子项目.目前,与Hyperledger的另外几个 ...

  5. Qt5.5.0使用mysql编写小软件源码讲解---顾客信息登记表

    Qt5.5.0使用mysql编写小软件源码讲解---顾客信息登记表 一个个人觉得比较简单小巧的软件. 下面就如何编写如何发布打包来介绍一下吧! 先下载mysql的库文件链接:http://files. ...

  6. 动态语言切换(续)-designer中的retranslateUi(带源码)

    本站所有文章由本站和原作者保留一切权力,仅在保留本版权信息.原文链接.原文作者的情况下允许转载,转载请勿删改原文内容, 并不得用于商业用途. 谢谢合作.原文链接:动态语言切换(续)-designer中 ...

  7. RocketMQ中Broker的HA策略源码分析

    Broker的HA策略分为两部分①同步元数据②同步消息数据 同步元数据 在Slave启动时,会启动一个定时任务用来从master同步元数据 if (role == BrokerRole.SLAVE) ...

  8. eclipse中tomcat调试正确关联源码

    1.build path中jar包关联本地源码 2.tomcat中添加source关联工程lib下的jar包 以上两步即可. 可解决tomcat直接关联本地源码debug时无法计算表达式的情况. 错误 ...

  9. android4.0 中关于内外置sd卡的获取及读写权限问题

    from://http://blog.chinaunix.net/uid-26727976-id-3146895.html 在2.x的版本中,在manifest中配置的权限android.permis ...

随机推荐

  1. zoj 3778 Talented Chef(思维题)

    题目 题意:一个人可以在一分钟同时进行m道菜的一个步骤,共有n道菜,每道菜各有xi个步骤,求做完的最短时间. 思路:一道很水的思维题, 根本不需要去 考虑模拟过程 以及先做那道菜(比赛的时候就是这么考 ...

  2. 函数 page_dir_get_n_heap

    查看某page中含有的记录个数 #define PAGE_N_HEAP 4 /* number of records in the heap, bit =flag: new-style compact ...

  3. UVa 11762 (期望 DP) Race to 1

    设f(x)表示x转移到1需要的次数的期望,p(x)为不超过x的素数的个数,其中能整除x的有g(x)个 则有(1-g(x)/p(x))的概率下一步还是转移到x,剩下的情况各有1/p(x)的概率转移到x/ ...

  4. 【COCOS2DX-LUA 脚本开发之十二】Hybrid模式-利用AssetsManager实现在线更新脚本文件lua、js、图片等资源(免去平台审核周期)

    本站文章均为李华明Himi原创,转载务必在明显处注明:(作者新浪微博:@李华明Himi) 转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/iphone-c ...

  5. ti processor sdk linux am335x evm /bin/unshallow-repositories.sh hacking

    #!/bin/bash # # ti processor sdk linux am335x evm /bin/unshallow-repositories.sh hacking # 说明: # 本文主 ...

  6. QPS、PV和需要部署机器数量计算公式(转)

    术语说明: QPS = req/sec = 请求数/秒 [QPS计算PV和机器的方式] QPS统计方式 [一般使用 http_load 进行统计] QPS = 总请求数 / ( 进程总数 *   请求 ...

  7. (转)c & c++内存分配

    一.预备知识—程序的内存分配 一个由c/C++编译的程序占用的内存分为以下几个部分1.栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等.其操作方式类似于 数据结构中的栈. ...

  8. ffmpeg显示视频

    项目最近需要实现播放视频功能,这个在上家公司就做过.虽然跟之前的场景不一样,有以前的功底还是很快可以解决,事实也确实如此.在使用DShow处理完视频分割与合并后,继续使用DShow显示视频,很快即完成 ...

  9. 【又见LCS】NYOJ-37 回文字符串

    [题目链接] 回文字符串 时间限制:3000 ms  |  内存限制:65535 KB 难度:4   描述 所谓回文字符串,就是一个字符串,从左到右读和从右到左读是完全一样的,比如"aba& ...

  10. 确实是非常实用的Ubuntu命令

    1 文件管理 # ls ls -a 列出当前目录下的所有文件,包括以.头的隐含文件 文件管理 # ls ls-l或ll 列出当前目录下文件的详细信息 文件管理 # pwd pwd查看当前所在目录的绝对 ...