Android实现简单拨号器

开发工具:Andorid Studio 1.3

运行环境:Android 4.4 KitKat

代码实现

界面布局只有GridLayout和EditText两个控件,全部Button都是动态添加

<GridLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="wrap_content" android:layout_height="wrap_content"
android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="80dp" android:paddingBottom="@dimen/activity_vertical_margin"
android:orientation="horizontal" android:rowCount="6"
android:columnCount="3" android:layout_gravity="center"
android:id="@+id/girdLayoutMain" tools:context=".CallPhone"> <EditText
android:layout_columnSpan="3"
android:layout_gravity="fill_horizontal"
android:layout_width="match_parent"
android:maxWidth="600px"
android:singleLine="false"
android:maxLines="3"
android:editable="false"
android:textSize="30dp"
android:gravity="center"
android:id="@+id/edtPhoneNumber"/>
</GridLayout>

动态添加按钮,通过for循环从1到9,给 Button设置Tag值以示区分,根据网格中i对应的关系找到位置,填充整个网格,并绑定响应

for(int i = 1; i <= 9; i++){
Button btnNumber = new Button(this);
btnNumber.setTag(i);
btnNumber.setText(Integer.toString(i));
btnNumber.setMinWidth(minButtonWidth);
btnNumber.setMinHeight(minButtonHeight);
btnNumber.setOnClickListener(numClickListener);
GridLayout.Spec rowSpec = GridLayout.spec((i - 1) / 3 + 1);
GridLayout.Spec colSpec = GridLayout.spec((i - 1) % 3);
GridLayout.LayoutParams layoutParams = new GridLayout.LayoutParams(rowSpec, colSpec);
layoutParams.setGravity(Gravity.FILL);
gridLayout.addView(btnNumber, layoutParams);
}

为* 0 # 呼叫 清除 特别设置Text内容,其中,呼叫按钮占两个网格,需要特别设置

for(int i = 10; i <= 14; i++){
Button btnOther = new Button(this);
btnOther.setTag(i);
btnOther.setMinWidth(minButtonWidth);
btnOther.setMinHeight(minButtonHeight);
switch (i){
case 10:
btnOther.setText("*");
btnOther.setOnClickListener(numClickListener);
break;
case 11:
btnOther.setText("0");
btnOther.setOnClickListener(numClickListener);
break;
case 12:
btnOther.setText("#");
btnOther.setOnClickListener(numClickListener);
break;
case 13:
btnOther.setText(R.string.str_call);
btnOther.setOnClickListener(callClickListener);
break;
case 14:
btnOther.setText(R.string.str_clear);
btnOther.setOnTouchListener(clearTouchListener);
break;
default:
break;
} if(i == 13){
GridLayout.Spec rowSpec = GridLayout.spec((i - 1) / 3 + 1);
GridLayout.Spec colSpec = GridLayout.spec((i - 1) % 3, 2);
GridLayout.LayoutParams layoutParams = new GridLayout.LayoutParams(rowSpec, colSpec);
layoutParams.setGravity(Gravity.FILL);
gridLayout.addView(btnOther, layoutParams);
} else if(i == 14){
GridLayout.Spec rowSpec = GridLayout.spec((i - 1) / 3 + 1);
GridLayout.Spec colSpec = GridLayout.spec((i - 1) % 3);
GridLayout.LayoutParams layoutParams = new GridLayout.LayoutParams(rowSpec, colSpec);
layoutParams.setGravity(Gravity.FILL);
gridLayout.addView(btnOther);
} else{
GridLayout.Spec rowSpec = GridLayout.spec((i - 1) / 3 + 1);
GridLayout.Spec colSpec = GridLayout.spec((i - 1) % 3);
GridLayout.LayoutParams layoutParams = new GridLayout.LayoutParams(rowSpec, colSpec);
layoutParams.setGravity(Gravity.FILL);
gridLayout.addView(btnOther, layoutParams);
}
}

普通数字和特别字符只需要在字符串尾端添加相应字符,再设置Text内容即可

View.OnClickListener numClickListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
String phoneNumber = edtPhoneNumber.getText().toString();
int tag = (Integer)v.getTag();
if(tag <= 9){
phoneNumber += Integer.toString(tag);
}else if(tag == 10){
phoneNumber += "*";
}else if(tag == 11){
phoneNumber += "0";
} else if(tag == 12){
phoneNumber += "#";
}
edtPhoneNumber.setText(phoneNumber);
edtPhoneNumber.clearFocus();
}
};

呼叫按钮,需要在Manifest.xml文件中申请拨打电话权限,字符串不为空即可拨打电话,如为空,通过Toast控件给予用户提示

<uses-permission android:name="android.permission.CALL_PHONE" />
View.OnClickListener callClickListener = new View.OnClickListener(){
@Override
public void onClick(View v){
String phoneNumber = edtPhoneNumber.getText().toString();
try{
if(!phoneNumber.isEmpty()) {
Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + phoneNumber));
startActivity(intent);
}else{
Toast toast = Toast.makeText(CallPhone.this, "请输入号码", Toast.LENGTH_LONG);
toast.setGravity(Gravity.TOP, 0, 150);
toast.show();
}
} catch (Exception e) {
Log.d("Hint", "Call phone number is empty");
}
}
};

清除按钮,OnTouchListener,两种响应方式:点击的时候记录下点击的当前时间,并修改button的颜色为红色,提高用户体验;放开手指的时候,用当前时间和记录时间相比,如果小于800ms,则认为是短按,仅清除一个字符(判断字符是否为空),如果大于800ms,则认为是长按,清除整个字符串,手指离开时修改button为原本的默认样式

private long touchTime = 0;
private Drawable originButtonColor;
View.OnTouchListener clearTouchListener = new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if(event.getAction() == MotionEvent.ACTION_DOWN) {
touchTime = event.getEventTime();
originButtonColor = v.getBackground();
v.setBackgroundColor(Color.RED);
return true;
} else if(event.getAction() == MotionEvent.ACTION_UP){
long subStaTime = event.getEventTime() - touchTime;
v.setBackground(originButtonColor);
if(subStaTime < 800){
try{
String phoneNumber = edtPhoneNumber.getText().toString();
if(!phoneNumber.isEmpty()){
String temp = phoneNumber.substring(0, phoneNumber.length() - 1);
edtPhoneNumber.setText(temp);
edtPhoneNumber.clearFocus();
}
Log.d("Hint", "Clear a char successfully");
}catch (Exception e){
Log.d("Hint", "Can't clear no char");
return false;
}
return true;
} else{
edtPhoneNumber.setText(null);
return true;
}
}
return false;
}
};

效果图

初始界面->依次输入->短按清除->长按清除

空白呼叫->最长三行->输入电话号码->成功呼叫

一些总结

  1. 字符串变长的时候按钮控件也会变宽:通过设置button的最小宽度和最大宽度可以固定按钮的大小,这里我让EditText变为允许多行输入,行宽最大值与按钮齐宽。
  2. 一个按钮占两个网格:在以前的API中,通过设置Gravity的大小或者setColumnConent()函数可以修改达到目的,这也是博客中多使用的方法;在新版的API中,通过设置colspec中的第二个参数达到目的,通过翻阅API中文论坛查询得知。

工程下载

传送门:下载

Android实现简单拨号器的更多相关文章

  1. Android实战--电话拨号器

    今天跟着黑马视频建立一个android app--电话拨号器 首先新建一个android项目 activity_main_xml中的代码如下: <RelativeLayout xmlns:and ...

  2. 简单拨号器(Android)

    感受: 1.了解了intent中的action和Uri. 2.了解了向下一个活动传递数据. 3.了解了内容提供器. 4.了解自定义适配器. 4.其实T9拨号器和简单计算器原理一样.

  3. android之电话拨号器

    在android入门的案例中,除了HelloWorld这个经典案例,还有一个电话拨号器需要掌握,现在我就来个电话拨号器的示范,毕竟大牛也是从菜鸟进化而来的. 首先你应该知道自己要设置怎样的UI,然后创 ...

  4. Android入门——电话拨号器和四种点击事件

    相对于HelloWorld来说,电话拨号器也是Android的一个入门demo,从这个样例我们要理清楚做安卓项目的思路. 大体分为三步: 1.理解需求,理清思路 2.设计UI 3.代码实现 电话拨号器 ...

  5. Android入门——电话拨号器和4种点击事件

    关于HelloWorld为,电话拨号程序还AndroidA入门demo,从这个样例我们要理清楚做安卓项目的思路. 大体分为三步: 1.理解需求,理清思路 2.设计UI 3.代码实现 电话拨号器 1.  ...

  6. Android 笔记 day2 拨号器

  7. Android入门之简单拨号器

    效果图: package jk.phone; import android.net.Uri; import android.os.Bundle; import android.app.Activity ...

  8. Android项目——电话拨号器

    因为应用要使用手机的电话服务,所以要在清单文件AndroidManifest.xml中添加电话服务权限: <?xml version="1.0" encoding=" ...

  9. Android学习之电话拨号器

    本人自己是做android驱动的,也会接触到系统层.上层的应用,所以在闲暇的时候也就开始了学习android应用的路程,在这里把这些东西记下来,希望自己能坚持下去,也好以后复习用. 今天先实现一个简单 ...

随机推荐

  1. JavaScript常用代码段

    总结一下在各种地方看到的还有自己使用的一些实用代码 1)区分IE和非IE浏览器 if(!+[1,]){ alert("这是IE浏览器"); } else{ alert(" ...

  2. sql server 2008 R2 配置开启远程访问

  3. dell N1500 安全配置

    http://www.dell.com/Support/Article/us/en/19/HOW10832 Setting a management IP address A reachable IP ...

  4. 解决Github访问超慢问题[自己留档]

    解决Github访问超慢问题 Github is so slowly. 这段时间访问 github 都非常慢,google了一下发现是github某个CDN被伟大的墙屏蔽所致. 出问题的应该是这个CD ...

  5. C#多线程案例基础

    C#多线程案例基础(转) 在学习多线程之前,我们先来看几个概念: 1,什么是进程?    当一个程序开始运行时,它就是一个进程,进程包括运行中的程序和程序所使用到的内存和系统资源,当然一个程序也可能开 ...

  6. Android手机与计算机间的”信任关系”

    在iDevices(如iPhone.iPad等等)的取证方面,那个代表”信任关系”的plist无疑是最为关键的迹证,只要有了它,哪怕是最新机型的iDevice及最新版的iOS,且有着指纹保护或pass ...

  7. 智能手机取证利器再进化-UFED Cloud Analyzer

    智能手机在现代人生活中,和钱包,钥匙一样,成了不可或缺的生活必需品,举凡食衣住行育乐都需要携带随身使用,因此,智能手机里所存放的,就是一个人的生活缩影,只是人们多半不自知智能手机竟是如此贴心的为你/妳 ...

  8. su:认证失败

    使用命令[su - root]切换用户,提示[su:认证失败] 原因:Ubuntu安装之后,root用户默认是被锁定的,不允许登录,也不允许su到root. 解决:重新设置密码 在终端输入命令:sud ...

  9. HTML与XHTML的区别

    为什么要使用XHTML? 我们认为万维网上的许多页面都包含着糟糕的 HTML 代码. 下面的 HTML 代码仍然可以工作得很好,即使它没有遵守 HTML 规则: <html> <he ...

  10. 转:OpenCms 9.0.1汉化

    LHD私人汉化. 1.完成安装OpenCms 2.如果正确安装,在浏览器输入以下地址即可打开登录页面(默认账号/密码:Admin/admin) http://localhost:8080/opencm ...