1.4 案例-电话拨号器

通过该案例可以学会

①基本布局的编写

②权限的声明

③EditText值的获取

③Button点击事件的监听

④意图的使用⑤调用系统拨打电话功能。

需求:如图1-29所示,界面顶部有一个文本输入框,当用户输入号码后点击右侧的拨打按钮可以实现拨号功能。


1.4.1 编写布局
【文件1-1】 activity_main.xml

1.	<!-- 使用垂直的线性布局 -->
2.	<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
3.	    xmlns:tools="http://schemas.android.com/tools"
4.	    android:layout_width="match_parent"
5.	    android:layout_height="match_parent"
6.	    android:orientation="vertical" >
7.	
8.	    <!-- 文本编辑框 -->
9.	    <EditText
10.	        android:id="@+id/et_num"
11.	        android:layout_width="match_parent"
12.	        android:layout_height="wrap_content"
13.	        android:hint="请输入电话号码" />
14.	
15.	    <Button
16.	        android:id="@+id/btn"
17.	        android:layout_width="wrap_content"
18.	        android:layout_height="wrap_content"
19.	        android:layout_gravity="right"
20.	        android:text="拨打" />
21.	
22.	</LinearLayout>
注意:
       上面的布局文件使用的垂直的线性布局,线性布局有垂直vertical和水平horizontal两个方向,若不写默认后者,但是强烈建议大家写出来。 

       android:layout_width属性有三个固定的常量值,分别为:wrap_content包裹类型,控件内容有多大就尽量给分配多大的空间;match_parent、fill_parent是填充父控件类型,后者已经被废弃,使用前者代替,使用该类型的控件尺寸跟父控件的尺寸保持一样大。控件的尺寸除了这三种常量外还可以输入自定的尺寸。

       android:id="@+id/et_num"属性是为了给每一个控件分配一个编号id,该id会记录在R类的子类id类中,这样方便于我们在代码中通过R.id获取到控件的引用。“@”后面跟的“+”号意思是该id对应的值et_num需要新添加到R类中,而不是引用该值。

       android:hint="请输入电话号码" 提示信息属性,当用户什么都没有输入的时候会显示提示信息。
android:layout_gravity="right"在Button控件中使用到了这个属性,表示该控件在父布局中的排列方式,这里的值为right,显然是靠右排列。
android:text="拨打" Button按钮显示的文本属性。


1.4.2 编写代码
在MainActivity中实现业务逻辑,
【文件1-2】 MainActivity.java
1. package com.itheima.android.phone;
2. 
3. import android.net.Uri;
4. import android.os.Bundle;
5. import android.app.Activity;
6. import android.content.Intent;
7. import android.view.View;
8. import android.view.View.OnClickListener;
9. import android.widget.Button;
10. import android.widget.EditText;
11. /**
12.  * 
13.  * 
14.  */
15. public class MainActivity extends Activity {
16. 	// 将两个控件声明为成员变量
17. 	private EditText et_num;
18. 	private Button btn;
19. 
20. 	/**
21. 	 * 覆写Activity类的onCreate方法
22. 	 */
23. 	@Override
24. 	protected void onCreate(Bundle savedInstanceState) {
25. 		// 必须调用一次父类的该方法,因为父类中做了大量的工作
26. 		super.onCreate(savedInstanceState);
27. 		/*
28. 		 * 该方法是从Activity类继承过来的,用于将xml布局文件跟当前Activity绑定起来,
29. 		 * 然后展现到用户界面
30. 		 * 通过R的内部类layout(没错,layout是一个类名,显然没有按照Java命令规范来,
31. 		 * 这里Google有其用意)获取到activity_main.xml文件的引用
32. 		 */
33. 		setContentView(R.layout.activity_main);
34. 		/*
35. 		 * 通过调用父类的findViewById方法,根据控件的id获取控件对象
36. 		 */
37. 		et_num = (EditText) findViewById(R.id.et_num);
38. 		btn = (Button) findViewById(R.id.btn);
39. 		/*
40. 		 * 给Button设置点击监听器,通过该监听器才能监听到用户的点击事件,
41. 		 * 这里传入的实现OnClickListener接口的子类对象
42. 		 */
43. 		btn.setOnClickListener(new MyOnClickListener());
44. 	}
45. 	/**
46. 	 * 自定义类继承OnClickListener类,覆写onClick方法,如果用户点击了按钮,
47. 	 * 那么系统会回调onClick方法
48. 	 *	
49. 	 */
50. 	class MyOnClickListener implements OnClickListener {
51. 
52. 		@Override
53. 		public void onClick(View v) {
54. 			// 从EditText控件中获取用户输入的数据
55. 			String num = et_num.getText().toString().trim();
56. 			/*
57. 			 * 创建意图对象,因此拨打电话其实是调用Android系统的拔打电话功能,
58. 			 * 而且拨打电话是有界面的,因此需要通过Intent远程调启Activity
59. 			 */
60. 			Intent intent = new Intent();
61. 			/*
62. 			 * 设置Action,代表了你想干嘛,在这个案例中我们想打电话,这是一个很常用的动作,
63. 			 * 因此已经被作为String类型的常量封装到Intent类中了
64. 			 * 因此这里直接使用Intent的ACTION_CALL静态变量即可。
65. 			 * 
66. 			 */
67. 			intent.setAction(Intent.ACTION_CALL);
68. 			/*
69. 			 * 给Intent设置数据,因为打电话肯定得有对方号码,setData方法的形参是Uri类型的,
70. 			 * 因此需要使用Uri的parse方法
71. 			 * parse方法中传入的是字符串,在这里字符串还必须按照tel:xxxx的数据个数,
72. 			 * 因此这是系统在配置文件中写死了。随着课程的深入我们会理解为何这里
73. 			 * 的数据格式必须这么写,这里大家先记住就行。
74. 			 */
75. 			Uri uri = Uri.parse("tel:" + num);
76. 			intent.setData(uri);
77. 			// 调用父类Activity中的startActivity方法,传入意图,从而实现调用系统的打电话功能
78. 			startActivity(intent);
79. 		}
80. 	}
81. }
82. 
注意:
        上面的代码其实已经实现了点击事件的第一种方式,通过自定义类实现OnClickListener接口,然后给Button设置setOnClickListener()方法中传递该类的对象即可。
1.4.3 添加权限
在Android系统中凡是可能会侵犯到用户隐私或者耗费用户钱财的行为都必须声明出来,以便让用户在安装Android应用时有知情权,然后选择是否安装。这是Android安全机制中的一部分。
在该案例中我们的应用实现了拨打电话的功能,那么这种行为肯定是需要声明权限的,因此我们必须在AndroidManifest.xml中声明如下权限。
 <uses-permission android:name="android.permission.CALL_PHONE"/>
添加过权限后部署应用,然后输入号码,测试拨打功能即可。

你可能感兴趣的:(1.4 案例-电话拨号器)