本文译自:http://developer.android.com/training/basics/firstapp/starting-activity.html
本课工程代码下载地址:http://download.csdn.net/detail/fireofstar/4855426
学习完前一课之后,你应该有一个应用程序,它会显示一个带有一个文本域和一个按钮的Activity。在本节课中,你会在MainActivity中添加一些代码,当用户点击Send按钮时,会执行这些代码来启动一个新的Activity。
响应Send按钮点击事件
打开activity_main.xml布局文件,给<Button>元素添加android:onClick属性来响应按钮的on-click事件:
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/button_send"
android:onClick="sendMessage" />
android:onClick属性值“sendMessage”是你的Activity中的方法名称,当用户点击该按钮时,系统会调用这个方法。
打开MainActivity类(在src/目录中),添加对应的方法:
/** Called when the user clicks the Send button */
public void sendMessage(View view) {
// Do something in response to button
}
这会要求你导入View类:
import android.view.View;
提示:在Eclipse中,按下Ctrl+Shift+O组合键导入缺少的类(在Mac电脑上是Cmd+Shift+O组合键)。
为了让系统找到跟android:onClick属性所指定方法名相匹配的方法,代码中的方法必须遵循以下规则:
1. 必须是public类型;
2. 要有一个void类型的返回值;
3. 要只有一个View类型的参数(该View参数是用户点击的那个View对象)
接下来,你会在这个方法中编写读取文本域内容,并把该文本内容发送给另一个Activity的代码。
构建一个Intent对象
一个Intent是一个对象,它提供了分离组件间的运行时绑定(如两个Activity)。Intent对象代表了一个应用程序要做某些事情的意图。Intent的应用范围很宽,但大多数的时候会用于启动另外一个Activity。
在sendMessage()方法内,创建一个用于启动名叫DisplayMessageActivity的Activity的Intent对象:
Intent intent=newIntent(this,DisplayMessageActivity.class);
上述构造器需要两个参数:
1. 第一个参数是Context类型(因为Activity类是Context类的子类,所以这里使用this);
2. 第二个参数是Class类型,它指向一个应用程序组件,系统会把Intent对象发送给这个应用程序组件(在本例中,该Activity应该被启动)。
注意:如果你使用一个IDE环境,那么对DisplayMessageActivity的引用会产生一个错误,因为这个类还不存在。先忽略这个错误,一会儿我们会创建这个类。
Intent不仅允许启动另外一个Activity,而且还可以携带数据包。在sendMessage()方法内,使用findViewById()方法来获得EditText元素,并把它的文本值添加给Intent对象:
Intent intent = new Intent(this, DisplayMessageActivity.class);
EditText editText = (EditText) findViewById(R.id.edit_message);
String message = editText.getText().toString();
intent.putExtra(EXTRA_MESSAGE, message);
注意:你需要引入android.content.Intent和android.widget.EditText类。还要定义一个EXTRA_MESSAGE常量。
Intent对象可以用被叫做key-value的extras来携带各种类型的数据集合。putExtra()方法的第一个参数是键名称,第二个参数是值。
为了让下一个Activity能够查询到附加的数据,你应该使用public常量来定义Intent附加数据的键名。因此要在MainActivity类的顶部来定义EXTRA_MESSAGE常量:
public class MainActivity extends Activity {
public final static String EXTRA_MESSAGE = "com.example.myfirstapp.MESSAGE";
...
}
通常,使用应用程序包名来作为Intent附加数据的键名常量定义的前缀,是一个良好的习惯,这样会保证它们的唯一性。
启动第二个Activity
调用带有Intent参数的startActivity()方法来启动Activity。系统会接收这个调用,并启动Intent对象所指定的Activity的实例。
以下是Send按钮所涉及到的完整的sendMessage()方法:
/** Called when the user clicks the Send button */
public void sendMessage(View view) {
Intent intent = new Intent(this, DisplayMessageActivity.class);
EditText editText = (EditText) findViewById(R.id.edit_message);
String message = editText.getText().toString();
intent.putExtra(EXTRA_MESSAGE, message);
startActivity(intent);
}
创建第二个Activity
以下是使用Eclipse创建一个新的Activity的步骤:
1. 点击工具栏中New按钮;
2. 在弹出的窗口中,打开Android文件夹,并选择Android Activity。点击Next按钮;
图1.Eclipse中的新Activity向导。
3. 选择BlankActivity,并点击Next按钮;
4. 在Activity明细中填写以下信息:
A. Project:MyFirstApp
B. Activity Name:DisplayMessageActivity
C. Layout Name:activity_display_message
D.Title:My Message
E. Hierarchial Parent:com.example.myfirstapp.MainActivity
F. Navigation Type:None
点击Finish按钮。
如果你使用不同的IDE或命令行工具,就要在src/目录中创建一个新的名叫DisplayMessageActivity.java的类文件。
如果你使用Eclipse来创建这个Activity,那么请打开这个DisplayMessageActivity.java文件:
1. 这个类已经包含了所要求的onCreate()方法的一个实现;
2. 还有一个onCreateOptionsMenu()方法实现,但在本应用程序中不使用这个方法,因此你可以删除它。
3. 还有一个onOptionsItemSelected()方法的实现,它会处理操作栏的up行为,请保留该方法。
以下是这个类的代码:
public class DisplayMessageActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_display_message);
// Show the Up button in the action bar.
getActionBar().setDisplayHomeAsUpEnabled(true);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
NavUtils.navigateUpFromSameTask(this);
return true;
}
return super.onOptionsItemSelected(item);
}
}
如果你使用的是Eclipse以外的IDE,就要使用上面的代码来更新你的DisplayMessageActivity类。
所有的Activity的子类都必须实现onCreate()方法。系统会在创建该Activity实例的时候调用这个方法。这个方法是你必须用setContentView()方法定义Activity布局的位置,并且也是初始化该Activity组件的位置。
注意:如果你使用不是Eclipse的IDE,那么你的工程不会包含setContentView()方法所要求的activity_display_message布局文件。在本例中,不会有问题,因为稍后更新了onCreate()方法后,就会不使用这个布局文件了。
添加标题字符串
如果你使用Eclipse,你可以跳过下一节,因为模板会给这个新的Activity提供标题字符串。
否则,把新的Activity的标题添加到strings.xml文件中:
<resources>
...
<string name="title_activity_display_message">My Message</string>
</resources>
把这个Activity添加到清单中
所有的Activity都必须在你的清单(AndroidManifest.xml)中使用<activity>元素来声明。
当你使用Eclipse工具来创建这个Activity时,它会创建一个默认的实体。否则,你需要把以下内容添加到清单文件中:
<application ... >
...
<activity
android:name="com.example.myfirstapp.DisplayMessageActivity"
android:label="@string/title_activity_display_message"
android:parentActivityName="com.example.myfirstapp.MainActivity" >
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="com.example.myfirstapp.MainActivity" />
</activity>
</application>
android:parentActivityName属性声明这个Activity的父Activity的名称。系统使用这个值来实现默认的导航行为,如Android4.1(API Level 16)以上版本中的Up导航。通过使用支持类库,并添加像上面那样的<meta-data>元素,你可以给较低的Android版本提供相同的导航行为。
注意:你的Android SDK应该已经包含了最新的Android支持类库,包括捆绑的ADT,但是如果你使用的是不同的IDE,你应该在添加平台和包的时候完成对它的安装。在使用Eclipse中的模板的时候,支持类库会自动的添加到你的应用程序的工程中(在Android Dependencies中你可以看到类库的JAR文件)。如果你没有使用Eclipse,你就需要手动的把类库添加给你的工程---按照建立支持类库指南来做,然后返回。
如果你在使用Eclipse来进行开发,现在就可以运行你的应用程序了,但是不会有什么特别的发生。点击Send按钮启动第二个Activity,但是他会使用模板提供的默认的“Hello world”模板。一会儿你会更新这个Activity来替换这个定制的文本View的显示,因此如果你使用的是不同的IDE,那么就不要担心依然还不能编译的应用程序。
接收Intent
每个由Intent调用的Activity,不管你是如何导航到那儿的,你都可以通过调用getIntent()方法来获得启动你Activity的那个Intent对象,并且获得包含其中的数据。
在DisplayMessageActivity类的onCreate()方法中,获得由MainActivity发送的Intent对象并提取其中的消息:
Intent intent = getIntent();
String message = intent.getStringExtra(MainActivity.EXTRA_MESSAGE);
显示消息
创建一个TextView,并使用setText()方法给它设置文本来把消息显示在屏幕上。然后通过setContentView()方法把TextView作为这个Activity的根View添加到布局中。
以下是DisplayMessageActivity类的onCreate()方法的完整代码:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Get the message from the intent
Intent intent = getIntent();
String message = intent.getStringExtra(MainActivity.EXTRA_MESSAGE);
// Create the text view
TextView textView = new TextView(this);
textView.setTextSize(40);
textView.setText(message);
// Set the text view as the activity layout
setContentView(textView);
}
现在运行这个应用程序,在打开时,在文本域中键入消息,然后点击Send按钮,就会看到显示消息的第二个Activity。
图2.运行在Android4.0上的应用中的两个Activity。