Android开发从入门到精通(7) _6
修改AndroidPhoneDialer 第七章(6)
本节展示如何通过修改AndroidPhoneDialer来增加一些特性,使得它更加的具有实际价值。到本节结束时,你不仅仅对使用intent的得心应手,而且还会使用EditTexts和Buttons。
警告
如果你没有跟从上一节的项目,回去并创建那个活动。本节的教程假定你已经完成了从上个项目的可以自行支配的编码工作。
增加一个按钮
本节向你展示如何修改你的项目来包含一个按钮。当活动被启动,替代启动Intent的将会是一个按钮。除了文本,按钮是应用程序里最常用的对象。按钮组织用户和程序之间的交互作用。在Android里学会如何创建并利用按钮是必要的,如果要创建一个友好的活动。
你将要在main.xml里创建按钮了。回想一下第五章,你为Hello World!活动创建了TextView。TextView有一个清晰的结构,就像这样:
注意
记住,当你在main.xml里创建一个View时,你只是告诉Android,你想让这个View看上去是什么样的。你仍旧需要在AndroidPhoneDialer.java内把功能赋值给它。
<View android:id=<id> android:layout_width=<width> android:layout_height=<height> > |
这个格式对于所有的views都有用,并且Button也不例外。你需要为你的Button设定的XML属性是 android:id, android:layout_width, android:layout_height,和 android:text。这4个XML属性充分的描述了按钮,那样你就可以在活动中使用它了。
1、赋值你的按钮的ID到 callButton:
android:id="@+id/callButton" |
2、独自设置 layout_width 和 layout_height 到 fill_parent 和 wrap_content。
android:layout_width="fill_parent" android:layout_height="wrap_content" |
3、设置按钮的文本为“Show Dialer”,这个是一个清晰的描述来告知按钮的作用:
android:text="Show Dialer" ThefullXMLfortheButton,withattributes,lookslikethis: <Buttonandroid:id="@+id/callButton" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Show Dialer" /> |
现在看看完成后的main.xml文件。按钮在上下文中显示并且等待着你的编码。
<?xml version="1.0" encoding="utf-8"?> <LinearLayoutxmlns:android=http://schemas.android.com/apk/res/android android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <Buttonandroid:id="@+id/callButton" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="ShowDialer"/> </LinearLayout> |
要开始为按钮增加功能,你需要增加其它的包装到AndroidPhoneDialer.java这个文件。包含按钮View的是android.widget.Button;
现在你已经在项目里输入按钮窗口小部件了(Button widget)。这些给了你必要的信息来开始你项目的编码工作。你项目的最终编码结果应当是有一个按钮在活动中,当点击它,启动呼叫活动。呼叫活动应当和数据“tel:5551212”一起启动。屏幕显示结果应该和初始的AndroidPhoneDialer相匹配。描述的功能围绕一些不同的概念。首先,你必须编程一个按钮,按钮的属性在main.xml文件内建立。下一步,你必须创建一个功能来启动前一个编码项目的CALL_ACTION这个Intent。最后,你的按钮应该能执行这个功能并且启动Intent。
创建按钮的语法是
final Button <button_name> = <button> |
等号左边的部分在代码中创建按钮。右边是从main.xml文件中调用按钮的属性。要调用它的属性,你使用findViewByID()把结果投递为一个按钮。这个听起来比它实际情况复杂。
记住,当你增加按钮的属性到main.xml文件中,你给了这个按钮一个定义好的android:id,callButton,而这个通过Android plugin for Eclipse在id文件中以R.id.callbutton注册。使用findViewById()来从main.xml文件中通过传递id callButton来找回:
findViewById(R.id.callButton) |
别忘了投递为按钮
(Button) findViewById(R.id.callButton) |
这个声明构成了等号右边的内容。创建完整的按钮应该是这样的:
final Button callButton = (Button) findViewById(R.id.callButton); |
现在你有一个可以工作的按钮了,但是你需要它来做点什么。按钮本身在没有代码的情况下无法完成太多的工作。根据本例的目的,你需要让它来执行CALL_ACTION这个Intent。因此,你需要在你现有的Intent呼叫中创建一个小的功能。这样,当按钮被按下时,你可以呼叫了。
如果你熟悉Java编程,这里就没什么好奇怪的了。你将要设置onClick()方法来从前一个部分呼叫Intent代码。onClick()方法拿去一个View作为一个变量;但是,本例中,并没有在onClick()方法本身内呼叫任何的View:
public void onClick(View v){ IntentcallIntent=new Intent(Intent.CALL_ACTION,Uri.parse("tel:5551212")); callIntent.setLaunchFlags(Intent.NEW_TASK_LAUNCH); startActivity(callIntent); } |
代码左边是程序中仅有的绑定按钮到onClick的接受器。接收器对于Java编程者是非常熟悉的。对于不熟悉Java或者接收器的人来说。接收器是Java对象可以从其它对象“接受”的方法。同样的概念也适用于Android。你可以在Android中建立接收器,来允许Android的Views从其它的输入中处理呼叫。对于本项目,你需要为你的按钮创建一个接收器来接受活动中的按钮的onclick事件。当用户按下按钮,接收器,接收器会呼叫在onClick()方式中的代码。要建立接收器,你需要使用按钮的setOnClickListener()方法。
如果你熟悉Java开发,这个结构不应当看起来陌生。这个是Java中典型的onClickListener接口执行。你在这里将会看到的是使用一个Java匿名的类来为按钮执行onClickListener。还有,作为一个匿名类,你可以用作本地变量来使用-本例中是按钮,如果变量被定义为最终的。
setOnClickListener( ) 方法抓取一对变量。第一个是onClickListener()的实例。第二个是早前建立的onClick。你的setOnClickListener()应当看上去想这样:
callButton.setOnClickListener(new Button.OnClickListener() { publicvoidonClick(Viewv){ IntentcallIntent=new Intent(Intent.CALL_ACTION,Uri.parse("tel:5551212")); callIntent.setLaunchFlags(Intent.NEW_TASK_LAUNCH); startActivity(callIntent); } }); |
这部分代码陈述了当callButton被按下,onClickListerner将执行onClick中的代码。onClick中的代码将执行CALL_ACTION Intent并且呼叫电话号码 555-1212。
你完成的AndroidPhoneDialer.java看起来像这样:
package android_programmers_guide.AndroidPhoneDialer; importandroid.app.Activity; importandroid.os.Bundle; importandroid.widget.Button; importandroid.view.View; importandroid.content.Intent; importandroid.net.Uri; publicclassAndroidPhoneDialerextendsActivity{ /**Calledwhentheactivityisfirstcreated.*/ @Override publicvoidonCreate(Bundleicicle){ super.onCreate(icicle); setContentView(R.layout.main); /**CreatetheButton*/ finalButtoncallButton=(Button)findViewById(R.id.callButton); /**SettheonClickListenertocalltheonClick*/ callButton.setOnClickListener(newButton.OnClickListener(){ /**UsetheonClicktocalltheexistingIntentcode*/ publicvoidonClick(Viewv){ IntentcallIntent=new Intent(Intent.CALL_ACTION,Uri.parse("tel:5551212")); callIntent.setLaunchFlags(Intent.NEW_TASK_LAUNCH); startActivity(callIntent); } }); } } |
在模拟器中编译并运行这个活动。主要的活动将显示标签为Show Dialer的按钮。点击这个按钮,它应当打开Call活动并拨号555-1212。主要活动应该如下图(略)。
如你所见,Android是一个非常健全并灵活的平台。有几行相关的代码,比一页少,你已经创建了一个利用设备电话硬件的活动并且由按钮启动。同样,就这一点来说,你应当对Android处理活动,Intent和Views的方式刚到舒适。
你的AndroidPhoneDialer活动仍然不是很健全。你需要增加一个更多的条目。本章的最后一节展示如何使用EditText View来运行用户输入一个电话号码。这个号码然后会被传递到CALL_ACTION Intent(而不是代码写好的数值:tel:5551212)。