在Android4.0中Contacts拨号盘界面剖析(源码)
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拨号盘界面剖析(源码)的更多相关文章
- Spark-1.6.0中的Sort Based Shuffle源码解读
从Spark-1.2.0开始,Spark的Shuffle由Hash Based Shuffle升级成了Sort Based Shuffle.即Spark.shuffle.manager从Hash换成了 ...
- Android4.0中蓝牙适配器state machine(状态机)的分析
今天晓东和大家来一起看一下Android4.0中蓝牙适配器(Bluetooth Adapter)的状态机变化的过程.首先,我们需要了解一下,蓝牙适配器究竟有哪些状态,从代码可以清晰地看到(framew ...
- Android菜鸟的成长笔记(6)——剖析源码学自定义主题Theme
原文:Android菜鸟的成长笔记(6)--剖析源码学自定义主题Theme 还记得在Android菜鸟的成长笔记(3)中我们曾经遇到了一个问题吗?"这个界面和真真的QQ界面还有点不同的就是上 ...
- Fabric2.2中的Raft共识模块源码分析
引言 Hyperledger Fabric是当前比较流行的一种联盟链系统,它隶属于Linux基金会在2015年创建的超级账本项目且是这个项目最重要的一个子项目.目前,与Hyperledger的另外几个 ...
- Qt5.5.0使用mysql编写小软件源码讲解---顾客信息登记表
Qt5.5.0使用mysql编写小软件源码讲解---顾客信息登记表 一个个人觉得比较简单小巧的软件. 下面就如何编写如何发布打包来介绍一下吧! 先下载mysql的库文件链接:http://files. ...
- 动态语言切换(续)-designer中的retranslateUi(带源码)
本站所有文章由本站和原作者保留一切权力,仅在保留本版权信息.原文链接.原文作者的情况下允许转载,转载请勿删改原文内容, 并不得用于商业用途. 谢谢合作.原文链接:动态语言切换(续)-designer中 ...
- RocketMQ中Broker的HA策略源码分析
Broker的HA策略分为两部分①同步元数据②同步消息数据 同步元数据 在Slave启动时,会启动一个定时任务用来从master同步元数据 if (role == BrokerRole.SLAVE) ...
- eclipse中tomcat调试正确关联源码
1.build path中jar包关联本地源码 2.tomcat中添加source关联工程lib下的jar包 以上两步即可. 可解决tomcat直接关联本地源码debug时无法计算表达式的情况. 错误 ...
- android4.0 中关于内外置sd卡的获取及读写权限问题
from://http://blog.chinaunix.net/uid-26727976-id-3146895.html 在2.x的版本中,在manifest中配置的权限android.permis ...
随机推荐
- 函数buf_page_create
/********************************************************************//** Initializes a page to the ...
- Spring MVC定义拦截器
拦截器: package sy.Interceptor; import javax.servlet.http.HttpServletRequest; import javax.servlet.http ...
- [总结]FFMPEG视音频编解码零基础学习方法--转
ffmpeg编解码学习 目录(?)[-] ffmpeg程序的使用ffmpegexeffplayexeffprobeexe 1 ffmpegexe 2 ffplayexe 3 ffprobeexe ...
- Java中的的XML文件读写与DOM
XML简介 要理解XML,HTML等格式,先来理解文档对象模型DOM 根据 DOM,HTML 文档中的每个成分都是一个节点,这些节点组成了一棵树.DOM 是这样规定的:整个文档是一个文档节点每个 HT ...
- 持有对象:总结JAVA中的常用容器和迭代器,随机数 速查
JAVA使用术语“Collection”来指代那些表示集合的对象,JAVA提供的接口很多,首先我们先来记住他们的层次结构: java集合框架的基本接口/类层次结构 java.util.Collecti ...
- poj 1201/zoj 1508 intervals 差分约束系统
// 思路 : // 图建好后 剩下的就和上一篇的 火烧连营那题一样了 求得解都是一样的 // 所以稍微改了就过了 // 最下面还有更快的算法 速度是这个算法的2倍#include <ios ...
- js获取客户端IP及地理位置
php获取方法: 1.<?php 2.function get_ip_place(){ 3.$ip=file_get_contents("http://fw.qq.com/ipaddr ...
- 最好用的汉字转拼音代码PinYin4Objc(PinYin4J的objc版本)
转:https://github.com/kimziv/PinYin4Objc 最好用的汉字转拼音代码PinYin4Objc(PinYin4J的objc版本)(更新到v1.1.1,增加block异步处 ...
- IOS 通知 alarm 记录
所有的内容融为一体,去除某一个项不知道结果如何. 最主要的前提:APP 会长期保留在后台 1.在info.plist 文件里面,加入 audio 后台请求 2.当APP 点击home进入后台之后,请求 ...
- CABasicAnimation 使用
1. 基本使用 UIView * view = [[UIView alloc]initWithFrame:CGRectMake(50, 50, 50,50)]; view.backgroundColo ...