启动另一个 Activity

完成上一课的学习后,您构建了一个应用,它可以显示一个 Activity(单一屏幕)并带有一个文本字段和一个按钮。在本课中,您将向 MainActivity 添加一些代码,这些代码可在用户点按 Send 时启动一个新的 Activity 来显示消息。

请注意:本课假设您使用 Android Studio 3.0 或更高版本。

响应 Send 按钮


请按照以下步骤操作,在 MainActivity 类中添加一个由按钮调用的方法:

在文件 app > java > com.example.myfirstapp > MainActivity 中,添加 sendMessage() 方法存根,如下所示:


public class MainActivity extends AppCompatActivity {

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

    }

    /** Called when the user taps the Send button */

    public void sendMessage(View view) {

        // Do something in response to button

    }

}

您可能会看到一条错误,因为 Android Studio 无法解析用作方法参数的 View 类。因此,请点击鼠标,将您的光标放置在 View 声明上,然后按 Alt + Enter(在 Mac 上,则按 Option + Return),执行快速修复。(如果出现菜单,请选择 Import class。)

现在,返回到 activity_main.xml 文件,从按钮调用此方法:

在 Layout Editor 中点击以选择按钮。

在 Attributes 窗口中,找到 onClick 属性,然后从下拉列表中选择 sendMessage [MainActivity]

现在,当点按按钮时,系统将调用 sendMessage() 方法。

请记下此方法中的详细信息,要让系统将此方法视为与 android:onClick 属性兼容,需要这些详细信息。具体而言,该方法具有以下特性:

公开访问

一个无效或(在 Kotlin 语言中)隐式单位返回值

以 View 作为唯一参数(它是之前点击的 View 对象)

接下来,您需要填写此方法以读取文本字段的内容,并将该文本传递给另一个 Activity。

构建一个 Intent


Intent 是指在相互独立的组件(例如两个 Activity)之间提供运行时绑定功能的对象。Intent 表示一个应用“执行某项操作的意向”。您可以将 intent 用于各种任务,但在本课中,您的 intent 将启动另一个 Activity。

在 MainActivity 中,添加 EXTRA_MESSAGE 常量和 sendMessage() 代码,如此处所示:

public class MainActivity extends AppCompatActivity {

    public static final String EXTRA_MESSAGE = "com.example.myfirstapp.MESSAGE";

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

    }

    /** Called when the user taps the Send button */

    public void sendMessage(View view) {

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

        EditText editText = (EditText) findViewById(R.id.editText);

        String message = editText.getText().toString();

        intent.putExtra(EXTRA_MESSAGE, message);

        startActivity(intent);

    }

}

Android Studio 再次遇到 Cannot resolve symbol 错误,因此,请按 Alt + Enter(在 Mac 上,则按 Option + Return)。您的导入应按如下所示方式结束:

import android.content.Intent;

import android.support.v7.app.AppCompatActivity;

import android.os.Bundle;

import android.view.View;

import android.widget.EditText;

DisplayMessageActivity 仍有错误,但没关系;您将在下一部分中修复该错误。

下面是 sendMessage() 中的操作:

Intent 构造函数采用两个参数:

Context 是第一个参数(之所以使用 this 是因为 Activity 类是 Context 的子类)

应用组件的 Class,系统应将 Intent(在本例中,为应该启动的 Activity)传递至该类。

putExtra() 方法将 EditText 的值添加到 intent。Intent 能够以名为 extra 的键值对形式携带数据类型。您的键是一个公共常量 EXTRA_MESSAGE,因为下一个 Activity 将使用该键来检索文本值。为 intent extra 定义键时最好使用应用的软件包名称作为前缀。这可以确保在您的应用与其他应用交互时这些键始终保持唯一。

startActivity() 方法将启动 Intent 指定的 DisplayMessageActivity 实例。现在,您需要创建该类。

Navigation Architecture Component(目前处于 alpha 版阶段)支持您使用 Navigation Editor 将一个 Activity 与另一个关联。关联关系建立后,您便可以在用户触发相关操作(即点击按钮)时使用 API 开启第二个 Activity。如需了解详情,请参阅 Navigation Architecture Component

创建第二个 Activity


在 Project 窗口中,右键点击 app 文件夹并选择 New > Activity > Empty Activity

在 Configure Activity 窗口中,为 Activity Name 输入“DisplayMessageActivity”,然后点击 Finish(保留所有其他属性设置为默认值)。

Android Studio 会自动执行三项操作:

创建 DisplayMessageActivity 文件。

创建对应的 activity_display_message.xml 布局文件。

在 AndroidManifest.xml 中添加必需的 <activity> 元素。

如果运行应用并在第一个 Activity 上点按按钮,则系统将启动第二个 Activity,但它为空。这是因为第二个 Activity 使用模板提供的空布局。

添加文本视图


图 1. 位于布局顶部中心的文本视图

新 Activity 包括一个空白的布局文件,因此,现在您需要在消息将要显示的位置添加一个文本视图。

打开文件 app > res > layout > activity_display_message.xml

点击工具栏中的 Turn On Autoconnect 

(Autoconnect 随后应启用,如图 1 所示)。

在 Palette 窗口中,点击 Text,然后将 TextView 拖动到布局中。请将其放置在靠近布局顶部中心的位置,使其吸附到出现的垂直线上。Autoconnect 将添加左侧和右侧约束条件,以将视图放置在水平中心。

再从文本视图的顶部创建一个约束条件,将其限制在布局顶部,让它看起来如图 1 所示。

也可以在 Attributes 窗口中展开 textAppearance 并更改属性(例如 textSize 和 textColor),对文本样式进行一些调整。

显示消息


现在,您将修改第二个 Activity,以显示第一个 Activity 传递的消息。

在 DisplayMessageActivity 中,向 onCreate() 方法添加下列代码:

@Override

protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_display_message);

    // Get the Intent that started this activity and extract the string

    Intent intent = getIntent();

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

    // Capture the layout's TextView and set the string as its text

    TextView textView = findViewById(R.id.textView);

   textView.setText(message);

按 Alt + Enter(在 Mac 上,则按 Option + Return)导入缺少的类。您的导入应按如下所示方式结束:

import android.content.Intent;

import android.support.v7.app.AppCompatActivity;

import android.os.Bundle;

import android.widget.TextView;

添加向上导航


在您的应用中,不是主要入口点的每个屏幕(所有不是“主”屏幕的屏幕)都应提供导航,以便用户在应用栏中点按“向上”按钮后可以返回应用层次结构中的逻辑父屏幕。

您需要做的全部工作是在 AndroidManifest.xml 文件中声明哪个 Activity 是逻辑父项。因此,请打开 app > manifests > AndroidManifest.xml 处的文件,找到 DisplayMessageActivity 的 <activity> 标记,然后将其替换为以下代码:

<activity android:name=".DisplayMessageActivity"

          android:parentActivityName=".MainActivity">

    <!-- The meta-data tag is required if you support API level 15 and lower -->

    <meta-data

        android:name="android.support.PARENT_ACTIVITY"

        android:value=".MainActivity" />

</activity>

Android 系统现在会在应用栏中自动添加“向上”按钮。

运行应用


现在,点击工具栏中的 Apply Changes 

,再次运行应用。当应用打开后,在文本字段中键入一条消息,点按 Send 以在第二个 Activity 中查看显示的消息。

图 2. 两个 Activity 的屏幕截图

就这么简单,您的第一个 Android 应用已成功诞生!

要继续学习 Android 应用开发的基础知识,请点击本教程头版提供的其他链接。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容