安卓训练-开始-开发你的第一个应用-启动另一个 Activity

来源:互联网 发布:湖南软件开发 编辑:程序博客网 时间:2024/05/21 10:23

启动另一个 Activity

上一课
下一课
这节课教你
  1. 响应 Send 按钮
  2. 创建一个 Intent
  3. 启动第二个 Activity
  4. 创建第二个 Activity
  5. 接收 Intent
  6. 显示消息
你还需要阅读
  • 安装 SDK

在完成了 上一课后,你已经有了一个显示一个包含文件字段和按钮的 activity(一个单一屏幕) 的应用。在这节课中,你会在MainActivity 中添加一些当用户点击 Send 按钮时启动一个新的 activity 的代码。

响应 Send 按钮


为了响应这个按钮的 on-click 事件,打开 activity_main.xml 布局文件并给<Button> 元素添加android:onClick 属性。

<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 的方法名匹配,签名必须和显示的一样。特别地,这个方法必须:

  • 是公有的
  • 没有返回值
  • 只有唯一一个 View 参数(被点击的那个View

下一步,你会填写这个方法,读取文本字段的内容并把它发送到另一个 activity。

创建一个 Intent


一个 Intent 是一个对象,它在不同的组件间(比如两个 activity)提供运行时绑定。Intent 代表了一个应用“做某事的意图”。你可以为各种各样的任务使用 intent,但常常是用它们启动另一个 activity。

sendMessage() 方法中,创建一个Intent 来启动一个叫做DisplayMessageActivity 的 activity:

Intent intent = new Intent(this, DisplayMessageActivity.class);

这里使用的构造方法有两个参数:

  • 第一个参数是一个 Context(用this 是因为ActivityContext 的一个子类)
  • 系统需要发送的 Intent 的目标应用组件的Class(在这个例子中,是那个需要启动的 activity)
发送 intent 到其他应用

这节课中创建的 intent 是一个显示的 intent,因为这个 Intent 指定了接收这个 intent 的确切的应用组件。然而,intent 还可以是隐式的,这种情况下Intent 没有指定所需的组件,但是允许这个设备上安装的任何应用响应这个 intent,只要它满足Intent 的 action 参数的元数据规格。更多信息,参见与其他应用交互。

注意: 如果你正使用一个 IDE 比如 Eclipse,对 DisplayMessageActivity 的引用会产生一个错误,因为这个类还不存在。现在先忽略这个错误,过会儿你会创建这个类。

一个 intent 不仅允许你启动另一个 activity,它还能携带一些数据到目标 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.Intentandroid.widget.EditText 的声明。你一会儿会定义EXTRA_MESSAGE 常量。

一个 Intent 可以携带一个称为extras 的数据集合,这个集合包含许多键值对格式的数据类型。putExtra() 方法,第一个参数是键的名称,第二个参数数值。

为了让下一个 activity 能查询附加的数据,你需要使用公共常量为你的 intent 的附加数据定义键。所以在 MainActivity 类的顶部添加 EXTRA_MESSAGE 定义:

public class MainActivity extends Activity {    public final static String EXTRA_MESSAGE = "com.example.myfirstapp.MESSAGE";    ...}

在为 intent 附加数据定义键时,用你的应用的包名作为前缀通常是很好的实践。假如你的应用与其他应用交互,这将保证它们是唯一的。

启动第二个 Activity


为了启动一个 activity,传入你的 Intent 调用startActivity()。系统接收这个调用并启动这个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);}

为了让这些代码能够工作,现在你需要创建 DisplayMessageActivity 类。

创建第二个 Activity


图 1. Eclipse 中的创建新 activity 的向导

使用 Eclipse 创建一个新的 activity:

  1. 点击工具栏上的 New
  2. 在出现的窗口中,打开 Android 目录并选择 Android Activity。点击Next
  3. 选择 BlankActivity 并点击 Next
  4. 填写 activity 详细信息:
    • Project: MyFirstApp
    • Activity Name: DisplayMessageActivity
    • Layout Name: activity_display_message
    • Title: My Message
    • Hierarchial Parent: com.example.myfirstapp.MainActivity
    • Navigation Type: None

    点击 Finish.

如果你使用一个不同的 IDE 或者命令行工具,在这个工程的 src/ 目录创建一个名称为 DisplayMessageActivity.java 的新文件,与原有的MainActivity.java 文件相邻。

打开 DisplayMessageActivity.java 文件。如果你使用 Eclipse 创建这个 activity:

  • 这个类已经包含了需要的 onCreate() 方法的实现。
  • 还有 onCreateOptionsMenu() 方法的实现,但在这个应用中你不需要它,所以你可以删除它。
  • 还有 onOptionsItemSelected() 方法的实现,它处理操作栏的Up 行为。让它保持原样。

因为 ActionBar 应用程序接口只有在HONEYCOMB(API 等级 11)或更高版本才可用,你必须在getActionBar() 方法周围添加添加检查当前平台版本。 另外,你必须给onCreate() 方法添加@SuppressLint("NewApi") 标签来避免lint 错误。

现在 DisplayMessageActivity 类看起来像这样:

public class DisplayMessageActivity extends Activity {    @SuppressLint("NewApi")    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_display_message);        // Make sure we're running on Honeycomb or higher to use ActionBar APIs        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {            // 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);    }}

如果你使用其他 IDE 而不是 Eclipse,使用上面的代码更新你的 DisplayMessageActivity 类。

Activity 的所有子类必须实现onCreate() 方法。系统在创建 activity 的一个新的实例时会调用这个方法。在这个方法中,你必须使用setContentView() 方法定义 activity 的布局,你还需要为 activity 的组件执行初始设置。

注意:如果你使用其他 IDE 而不是 Eclipse,你的工程不包含 setContentView() 需要的activity_display_message 布局。那没有关系,随后你会更新这个方法,不再使用那个布局。

添加标题字符串

如果你使用 Eclipse,你可以跳到 下一小节,因为这个模板提供新的 activity 的标题字符串。

如果你使用其他 IDE 而不是 Eclipse,在 strings.xml 文件中添加新的 activity 的标题:

<resources>    ...    <string name="title_activity_display_message">My Message</string></resources>

在清单文件中添加它

所有的 activity 都必须使用 <activity> 元素在你的清单文件 AndroidManifest.xml 中声明。

如果你使用 Eclipse 工具创建 activity,它会创建一个默认入口。如果你使用不同的 IDE,你需要自己添加清单入口。它看起来应该像这样:

<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 的名称。系统使用这个值实现默认的导航行为,例如安卓 4.1 (API 登记 16) 或更高版本的Up 导航。你可以通过使用Support Library 并像这里展示的添加<meta-data> 元素来为老版本的安卓提供同样的导航行为 。

注意:你的安卓的 SDK 应该已经包含最新的 Android Support Library。ADT Bundle 已经包含它了,但是如果你使用一个不同的 IDE,你需要在添加平台和包这一步骤中安装它。当在 Eclipse 中使用模板时,Support Library 已经自动添加到你的工程(你可以看到这个库的 JAR 文件在Android Dependencies 下列了出来)。如果你没有使用 Eclipse,你需要手动把这个库添加到你的工程—按照 设置 Support Library 指南 进行设置,然后返回这里。

如果你使用 Eclipse 进行开发,现在你就可以运行应用了,并不需要太多的事情。点击 Send 按钮启动第二个 activity,它使用模板提供的默认的 "Hello world" 布局。过会你会更新这个 activity 显示一个自定义的文本视图,所以如果你使用一个不同的 IDE,不用担心应用还没有编译。

接收 Intent


每个 Activity,不管用户怎样导航到那里,都由一个Intent 触发。你可以调用getIntent() 取得启动你的 activity 的Intent 并检索它包含的数据。

DisplayMessageActivity 类的onCreate() 方法中,取得 intent 并提取发送给MainActivity 的消息:

Intent intent = getIntent();String message = intent.getStringExtra(MainActivity.EXTRA_MESSAGE);

显示消息


为了在屏幕上显示这个消息,创建一个 TextView 控件并使用setText() 设置文本。然后把它传给setContentView() 作为根视图添加到这个 activity 的布局中。

现在 DisplayMessageActivity 的完整的onCreate() 方法看起来像这样:

@Overridepublic 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. 最终版应用的两个 activity,运行在安卓 4.0上。

好了,你已经建成了你的第一个安卓应用!

为了学习更多,跟随下面的链接进入下一课。

上一课下一课
 
 
0 0
原创粉丝点击