Android实现简单拨号器

开发工具:Andorid Studio 1.3

运行环境:Android 4.4 KitKat

代码实现

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

  1. <GridLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:tools="http://schemas.android.com/tools"
  3. android:layout_width="wrap_content" android:layout_height="wrap_content"
  4. android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin"
  5. android:paddingTop="80dp" android:paddingBottom="@dimen/activity_vertical_margin"
  6. android:orientation="horizontal" android:rowCount="6"
  7. android:columnCount="3" android:layout_gravity="center"
  8. android:id="@+id/girdLayoutMain" tools:context=".CallPhone">
  9. <EditText
  10. android:layout_columnSpan="3"
  11. android:layout_gravity="fill_horizontal"
  12. android:layout_width="match_parent"
  13. android:maxWidth="600px"
  14. android:singleLine="false"
  15. android:maxLines="3"
  16. android:editable="false"
  17. android:textSize="30dp"
  18. android:gravity="center"
  19. android:id="@+id/edtPhoneNumber"/>
  20. </GridLayout>

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

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

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

  1. for(int i = 10; i <= 14; i++){
  2. Button btnOther = new Button(this);
  3. btnOther.setTag(i);
  4. btnOther.setMinWidth(minButtonWidth);
  5. btnOther.setMinHeight(minButtonHeight);
  6. switch (i){
  7. case 10:
  8. btnOther.setText("*");
  9. btnOther.setOnClickListener(numClickListener);
  10. break;
  11. case 11:
  12. btnOther.setText("0");
  13. btnOther.setOnClickListener(numClickListener);
  14. break;
  15. case 12:
  16. btnOther.setText("#");
  17. btnOther.setOnClickListener(numClickListener);
  18. break;
  19. case 13:
  20. btnOther.setText(R.string.str_call);
  21. btnOther.setOnClickListener(callClickListener);
  22. break;
  23. case 14:
  24. btnOther.setText(R.string.str_clear);
  25. btnOther.setOnTouchListener(clearTouchListener);
  26. break;
  27. default:
  28. break;
  29. }
  30. if(i == 13){
  31. GridLayout.Spec rowSpec = GridLayout.spec((i - 1) / 3 + 1);
  32. GridLayout.Spec colSpec = GridLayout.spec((i - 1) % 3, 2);
  33. GridLayout.LayoutParams layoutParams = new GridLayout.LayoutParams(rowSpec, colSpec);
  34. layoutParams.setGravity(Gravity.FILL);
  35. gridLayout.addView(btnOther, layoutParams);
  36. } else if(i == 14){
  37. GridLayout.Spec rowSpec = GridLayout.spec((i - 1) / 3 + 1);
  38. GridLayout.Spec colSpec = GridLayout.spec((i - 1) % 3);
  39. GridLayout.LayoutParams layoutParams = new GridLayout.LayoutParams(rowSpec, colSpec);
  40. layoutParams.setGravity(Gravity.FILL);
  41. gridLayout.addView(btnOther);
  42. } else{
  43. GridLayout.Spec rowSpec = GridLayout.spec((i - 1) / 3 + 1);
  44. GridLayout.Spec colSpec = GridLayout.spec((i - 1) % 3);
  45. GridLayout.LayoutParams layoutParams = new GridLayout.LayoutParams(rowSpec, colSpec);
  46. layoutParams.setGravity(Gravity.FILL);
  47. gridLayout.addView(btnOther, layoutParams);
  48. }
  49. }

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

  1. View.OnClickListener numClickListener = new View.OnClickListener() {
  2. @Override
  3. public void onClick(View v) {
  4. String phoneNumber = edtPhoneNumber.getText().toString();
  5. int tag = (Integer)v.getTag();
  6. if(tag <= 9){
  7. phoneNumber += Integer.toString(tag);
  8. }else if(tag == 10){
  9. phoneNumber += "*";
  10. }else if(tag == 11){
  11. phoneNumber += "0";
  12. } else if(tag == 12){
  13. phoneNumber += "#";
  14. }
  15. edtPhoneNumber.setText(phoneNumber);
  16. edtPhoneNumber.clearFocus();
  17. }
  18. };

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

  1. <uses-permission android:name="android.permission.CALL_PHONE" />
  2. View.OnClickListener callClickListener = new View.OnClickListener(){
  3. @Override
  4. public void onClick(View v){
  5. String phoneNumber = edtPhoneNumber.getText().toString();
  6. try{
  7. if(!phoneNumber.isEmpty()) {
  8. Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + phoneNumber));
  9. startActivity(intent);
  10. }else{
  11. Toast toast = Toast.makeText(CallPhone.this, "请输入号码", Toast.LENGTH_LONG);
  12. toast.setGravity(Gravity.TOP, 0, 150);
  13. toast.show();
  14. }
  15. } catch (Exception e) {
  16. Log.d("Hint", "Call phone number is empty");
  17. }
  18. }
  19. };

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

  1. private long touchTime = 0;
  2. private Drawable originButtonColor;
  3. View.OnTouchListener clearTouchListener = new View.OnTouchListener() {
  4. @Override
  5. public boolean onTouch(View v, MotionEvent event) {
  6. if(event.getAction() == MotionEvent.ACTION_DOWN) {
  7. touchTime = event.getEventTime();
  8. originButtonColor = v.getBackground();
  9. v.setBackgroundColor(Color.RED);
  10. return true;
  11. } else if(event.getAction() == MotionEvent.ACTION_UP){
  12. long subStaTime = event.getEventTime() - touchTime;
  13. v.setBackground(originButtonColor);
  14. if(subStaTime < 800){
  15. try{
  16. String phoneNumber = edtPhoneNumber.getText().toString();
  17. if(!phoneNumber.isEmpty()){
  18. String temp = phoneNumber.substring(0, phoneNumber.length() - 1);
  19. edtPhoneNumber.setText(temp);
  20. edtPhoneNumber.clearFocus();
  21. }
  22. Log.d("Hint", "Clear a char successfully");
  23. }catch (Exception e){
  24. Log.d("Hint", "Can't clear no char");
  25. return false;
  26. }
  27. return true;
  28. } else{
  29. edtPhoneNumber.setText(null);
  30. return true;
  31. }
  32. }
  33. return false;
  34. }
  35. };

效果图

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

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

一些总结

  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. C++ 学习基础一

    1.预处理器指示符如果文件名用尖括号“<”和”>”括起来的,则表示该文件是工程或标准头文件,查找过程会检查预定义的目录.如果文件名用双引号括起来,则表示该文件是用户自定义的头文件,查找该文 ...

  2. Solaris引导和关闭

    OpenBoot PROM简称OBP,相当于PC的BIOS,是控制SUN服务器的引导过程.初始化配置某些硬件并提供某些诊断的工具.常见OBP命令 boot boot:从默认设备启动boot -s:从默 ...

  3. SqlServer 事务和异常处理示例

    BEGIN TRANSACTION--开始事务 DECLARE @errorSun INT --定义错误计数器SET @errorSun=0 --没错为0 UPDATE dbo.Test SET te ...

  4. .NET中使用log4net

    一,加载log4net引用 下载log4net.dll,我们这里使用的是.NET2.0 下载地址:http://files.cnblogs.com/gosky/log4net-1.2.13-bin-n ...

  5. CentOS安装rpm包时error:Failed dependencies

    CentOS6.5安装rpm包时报错,error:Failed dependencies,解决方法如下: 在安装命令后加两个参数 --nodeps --force ,即安装时不再分析包之间的依赖关系而 ...

  6. iOS开发优化的25个方案

    写在前面 本文来自iOS Tutorial Team 的 Marcelo Fabri,他是Movile的一名 iOS 程序员.这是他的个人网站:http://www.marcelofabri.com/ ...

  7. Linux ssh exit,启动的后台进程不会停止

    一般情况下,想要通过终端长时间运行任务,需要使用nohup 或者 screen,如果不使用会怎么样呢?来测试一下   描述: 场景1:ssh登录机器,通过添加(&),启动任务到后台,通过exi ...

  8. 首页banner特效

     <link href="css/swiper.min.css" rel="stylesheet" />  <script src=" ...

  9. c#使用NPOI导出Excel及往Excel里追加记录

    最近在做一个打印发票的程序,要求保存打印记录,所以用到了NPOI往Excel里导入数据,但是遇到了一些问题没法解决,最后看了别人的Java程序后才明白.下面只是说明几个问题,而不是怎样使用NPOI 问 ...

  10. Copying Rowsets

    I find that you often need to create and manipulate standalone rowsets. Sometimes you can get the da ...