启动另一个 Activity

完成上一课后,您已经构建了一个应用,该应用将显示一个 Activity(单个屏幕),其中包含一个文本字段和一个按钮。在本课中,您将向 MainActivity 添加一些代码,以便在用户点按 Send 时,启动一个新的 Activity 来显示消息。

注意:本课要求您使用 Android Studio 3.0 或更高版本。

响应 Send 按钮

您可以向 MainActivity 类添加一个由该按钮调用的方法,具体步骤如下:

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

    Kotlin

        class MainActivity : AppCompatActivity() {
            override fun onCreate(savedInstanceState: Bundle?) {
                super.onCreate(savedInstanceState)
                setContentView(R.layout.activity_main)
            }
    
            /** Called when the user taps the Send button */
            fun sendMessage(view: View) {
                // Do something in response to button
            }
        }
        

    Java

        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。)

  2. 现在,返回到 activity_main.xml 文件,从该按钮调用此方法:
    1. 在布局编辑器中点击该按钮以将其选中。
    2. Attributes 窗口中,找到 onClick 属性,并从下拉列表中选择 sendMessage [MainActivity]

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

此方法中包含一些为了使系统将其识别为与 android:onClick 属性兼容所需的详细信息,请将这些信息记下来。具体来说,此方法具有以下特性:

  • 公开访问
  • 返回值为空,或为隐式单元(在 Kotlin 中)
  • View 作为唯一参数(它是用户已点击的 View 对象)

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

构建一个 Intent

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

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

Kotlin

    const val EXTRA_MESSAGE = "com.example.myfirstapp.MESSAGE"

    class MainActivity : AppCompatActivity() {
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)
        }

        /** Called when the user taps the Send button */
        fun sendMessage(view: View) {
            val editText = findViewById<EditText>(R.id.editText)
            val message = editText.text.toString()
            val intent = Intent(this, DisplayMessageActivity::class.java).apply {
                putExtra(EXTRA_MESSAGE, message)
            }
            startActivity(intent)
        }
    }
    

Java

    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)。您的导入最终应如下所示:

Kotlin

    import android.content.Intent
    import android.support.v7.app.AppCompatActivity
    import android.os.Bundle
    import android.view.View
    import android.widget.EditText
    

Java

    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 是第一个参数(之所以使用此参数,是因为 Activity 类是 Context 的子类)
    • 系统应将 Intent 传递到的应用组件的 Class(在本例中,为应启动的 Activity)。
  • putExtra() 方法将 EditText 的值添加到 Intent。Intent 能够以名为“extra”的键值对形式携带数据类型。您的键是一个公共常量 EXTRA_MESSAGE,因为下一个 Activity 将使用该键来检索文本值。为 Intent extra 定义键时,最好使用应用的软件包名称作为前缀。这样可以确保这些键是独一无二的,以便您的应用与其他应用进行交互。
  • startActivity() 方法将启动一个由 Intent 指定的 DisplayMessageActivity 实例。现在,您需要创建该类。

通过导航架构组件(目前为 Alpha 版),您可以使用导航编辑器将一个 Activity 与另一个 Activity 相关联。建立这种关联后,您可以利用 API 在用户触发关联的操作(例如,点击某个按钮)时启动第二个 Activity。要了解详情,请参阅导航架构组件

创建第二个 Activity

  1. Project 窗口中,右键点击 app 文件夹,然后依次选择 New > Activity > Empty Activity
  2. Configure Activity 窗口中,为 Activity Name 输入“DisplayMessageActivity”,然后点击 Finish(使所有其他属性保留默认值)。

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

  • 创建 DisplayMessageActivity 文件。
  • 创建对应的 activity_display_message.xml 布局文件。
  • AndroidManifest.xml 中添加必需的 <activity> 元素。

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

添加文本视图

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

新 Activity 包含一个空白布局文件,因此现在您要添加一个用来显示消息的文本视图。

  1. 打开 app > res > layout > activity_display_message.xml 文件。
  2. 点击工具栏中的 Turn On Autoconnect (系统应随即启用 Autoconnect,如图 1 中所示)。
  3. Palette 窗口中,点击 Text,然后将 TextView 拖动到布局中 - 将其放置在靠近布局顶部中心的位置,以使其贴靠到出现的垂直线上。Autoconnect 将添加左侧和右侧约束条件,以将该视图放置在水平中心。
  4. 再创建一个从文本视图顶部到布局顶部的约束条件,以使该视图如图 1 中所示。

或者,您可以对文本样式进行一些调整,方法是在 Attributes 窗口中展开 textAppearance,然后更改 textSizetextColor 等属性。

显示消息

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

  1. DisplayMessageActivity 中,向 onCreate() 方法添加以下代码:

    Kotlin

        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_display_message)
            
            // Get the Intent that started this activity and extract the string
            val message = intent.getStringExtra(EXTRA_MESSAGE)
    
            // Capture the layout's TextView and set the string as its text
            val textView = findViewById<TextView>(R.id.textView).apply {
                text = message
            }
        }
        

    Java

        @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);
        }
        
  2. 按 Alt + Enter(在 Mac 上,则按 Option + Return)导入缺少的类。您的导入最终应如下所示:

    Kotlin

        import android.content.Intent
        import android.support.v7.app.AppCompatActivity
        import android.os.Bundle
        import android.widget.TextView
        

    Java

        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 应用开发方面的基础知识,请点击本教程首页上提供的其他链接。