您的位置:首页 > 移动开发 > Android开发

Android培训---启动另外一个Activity

2012-12-06 21:32 411 查看
本文译自: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。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: