Android学习笔记之启动另一个 Activity

在这节课中,学习当用户点击发送 (Send) 按钮时启动一个新的 activity。

响应 Send (发送) 按钮

1 在 Android Studio 中打开 res/layout 目录下的 activity_my.xml 文件.

2 为 Button 标签添加 android:onclick 属性.

res/layout/activity_my.xml

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/button_send"
    android:onClick="sendMessage" />

android:onclick 属性的值 "sendMessage" 即为用户点击屏幕按钮时触发方法的名字。

3 打开 java/com.mycompany.myfirstapp 目录下 MyActivity.java 文件.

4 在 MyActivity.java 中添加 sendMessage () 函数:

java/com.mycompany.myfirstapp/MyActivity.java

/** Called when the user clicks the Send button */
public void sendMessage(View view) {
    // Do something in response to button
}

为使系统能够将该方法(你刚在 MyActivity.java 中添加的 sendMessage 方法)与在 android:onClick 属性中提供的方法名字匹配,它们的名字必须一致,特别需要注意的是,这个方法必须满足以下条件:

  • 是 public 函数
  • 无返回值
  • 参数唯一 (为 View 类型,代表被点击的视图)

接下来,你可以在这个方法中编写读取文本内容,并将该内容传到另一个 Activity 的代码。

构建一个 Intent

Intent 是在不同组件中 (比如两个 Activity) 提供运行时绑定的对象。Intent 代表一个应用 "想去做什么事",你可以用它做各种各样的任务,不过大部分的时候他们被用来启动另一个 Activity。更详细的内容可以参考 Intents and Intent Filters

1 在 MyActivity.java 的 sendMessage() 方法中创建一个 Intent 并启动名为 DisplayMessageActivity 的 Activity:

java/com.mycompany.myfirstapp/MyActivity.java

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

Note:如果使用的是类似 Android Studio 的 IDE,这里对 DisplayMessageActivity 的引用会报错,因为这个类还不存在;暂时先忽略这个错误,我们很快就要去创建这个类了。

在这个 Intent 构造函数中有两个参数:

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

  • 接受系统发送 Intent 的应用组件的 Class(在这个案例中,指将要被启动的 activity)。

Android Studio 会提示导入 Intent 类。

2 在文件开始处导入 Intent 类:

java/com.mycompany.myfirstapp/MyActivity.java

import android.content.Intent;

Tip: 在 Android Studio 中,按 Alt + Enter 可以导入缺失的类 (在 Mac 中使用 option + return)

3 在 sendMessage() 方法里用 findViewById() 方法得到 EditText 元素.

java/com.mycompany.myfirstapp/MyActivity.java

public void sendMessage(View view) {
  Intent intent = new Intent(this, DisplayMessageActivity.class);
  EditText editText = (EditText) findViewById(R.id.edit_message);
}

4 在文件开始处导入 EditText 类.

在 Android Studio 中,按 Alt + Enter 可以导入缺失的类 (在 Mac 中使用 option + return)

5 把 EditText 的文本内容关联到一个本地 message 变量,并使用 putExtra () 方法把值传给 intent.

java/com.mycompany.myfirstapp/MyActivity.java

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);
}

Intent 可以携带称作 extras 的键 - 值对数据类型。 putExtra() 方法把键名作为第一个参数,把值作为第二个参数。

6 在 MyActivity class, 定义 EXTRA_MESSAGE :

java/com.mycompany.myfirstapp/MyActivity.java

public class MyActivity extends ActionBarActivity {
    public final static String EXTRA_MESSAGE = "com.mycompany.myfirstapp.MESSAGE";
    ...
}

为让新启动的 activity 能查询 extra 数据。定义 key 为一个 public 型的常量,通常使用应用程序包名作为前缀来定义键是很好的做法,这样在应用程序与其他应用程序进行交互时仍可以确保键是唯一的。

7 在 sendMessage () 函数里,调用 startActivity () 完成新 activity 的启动,现在完整的代码应该是下面这个样子:

java/com.mycompany.myfirstapp/MyActivity.java

/** 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);
}

运行这个方法,系统收到我们的请求后会实例化在 Intent 中指定的 Activity,现在需要创建一个 DisplayMessageActivity类使程序能够执行起来。

创建第二个 Activity

Activity 所有子类都必须实现 onCreate () 方法。创建 activity 的实例时系统会调用该方式,此时必须用 setContentView () 来定义 Activity 布局,以对 Activity 进行初始化。

使用 Android Studio 创建新的 Activity

使用 Android Studio 创建的 activity 会实现一个默认的 onCreate () 方法.

  1. 在 Android Studio 的 java 目录,选择包名 com.mycompany.myfirstapp, 右键选择 New > Activity > Blank Activity.

  2. 在 Choose options 窗口,配置 activity:

    • Activity Name: DisplayMessageActivity
    • Layout Name: activity_display_message
    • Title: My Message
    • Hierarchical Parent: com.mycompany.myfirstapp.MyActivity
    • Package name: com.mycompany.myfirstapp

点击 Finish.

adt-new-activity

3 打开 DisplayMessageActivity.java 文件,此类已经实现了 onCreate () 方法,稍后需要更新此方法。另外还有一个 onOptionsItemSelected () 方法,用来处理 action bar 的点击行为。暂时保留这两个方法不变。

4 由于这个应用程序并不需要 onCreateOptionsMenu (),直接删除这个方法。

如果使用 Android Studio 开发,现在已经可以点击 Send 按钮启动这个 activity 了,但显示的仍然是模板提供的默认内容 "Hello world",稍后修改显示自定义的文本内容。

使用命令行创建 activity

如果使用命令行工具创建 activity,按如下步骤操作:

1 在工程的 src / 目录下,紧挨着 MyActivity.java 创建一个新文件 DisplayMessageActivity.java.

2 写入如下代码:

public class DisplayMessageActivity extends ActionBarActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_display_message);
        if (savedInstanceState == null) {
            getSupportFragmentManager().beginTransaction()
                .add(R.id.container, new PlaceholderFragment()).commit();
        }
    }
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);   
    /**
     * A placeholder fragment containing a simple view.
     */
    public static class PlaceholderFragment extends Fragment {
        public PlaceholderFragment() { }
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                  Bundle savedInstanceState) {
              View rootView = inflater.inflate(R.layout.fragment_display_message,
                      container, false);
              return rootView;
        }
    }
}

Note: 如果使用的 IDE 不是 Android Studio,工程中可能不会包含由 setContentView() 请求的 activity_display_message layout,但这没关系,因为等下会修改这个方法。

3 把新 Activity 的标题添加到 strings.xml 文件:

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

4 在 AndroidManifest.xml 的 Application 标签内为 DisplayMessageActivity 添加 <activity> 标签,如下:

<application ... >
    ...
    <activity
        android:name="com.mycompany.myfirstapp.DisplayMessageActivity"
        android:label="@string/title_activity_display_message"
        android:parentActivityName="com.mycompany.myfirstapp.MyActivity" >
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value="com.mycompany.myfirstapp.MyActivity" />
    </activity>
</application>

android:parentActivityName 属性声明了在应用程序中该 Activity 逻辑层面的父类 Activity 的名称。 系统使用此值来实现默认导航操作,比如在 Android 4.1(API level 16)或者更高版本中的 Up navigation。 使用 Support Library,如上所示的 <meta-data>元素可以为安卓旧版本提供相同功能。

Note: 我们的 Android SDK 应该已经包含了最新的 Android Support Library,它包含在 ADT 插件中。但如果用的是别的 IDE,则需要在 Adding Platforms and Packages 中安装。当 Android Studio 中使用模板时,Support Library 会自动加入我们的工程中 (在 Android Dependencies 中你以看到相应的 JAR 文件)。如果不使用 Android Studio,就需要手动将 Support Library 添加到我们的工程中,参考 setting up the Support Library

接收 Intent

不管用户导航到哪,每个 Activity 都是通过 Intent 被调用的。我们可以通过调用 getIntent() 来获取启动 activity 的 Intent 及其包含的数据。

1 编辑 java/com.mycompany.myfirstapp 目录下的 DisplayMessageActivity.java 文件.

2 删除 onCreate () 方法中下面一行:

  setContentView(R.layout.activity_display_message);

3 得到 intent 并赋值给本地变量.

Intent intent = getIntent();

4 为 Intent 导入包.

在 Android Studio 中,按 Alt + Enter 可以导入缺失的类 (在 Mac 中使用 option + return).

5 调用 getStringExtra () 提取从 MyActivity 传递过来的消息.

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

显示文本

1 在 onCreate () 方法中,创建一个 TextView 对象.

TextView textView = new TextView(this);

2 设置文本字体大小和内容.

textView.setTextSize(40);
textView.setText(message);

3 通过调用 activity 的 setContentView () 把 TextView 作为 activity 布局的根视图.

setContentView(textView);

4 为 TextView 导入包.

在 Android Studio 中,按 Alt + Enter 可以导入缺失的类 (在 Mac 中使用 option + return).

DisplayMessageActivity 的完整 onCreate () 方法应该如下:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // Get the message from the intent
    Intent intent = getIntent();
    String message = intent.getStringExtra(MyActivity.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);
}

现在你可以运行 app,在文本中输入信息,点击 Send (发送) 按钮,ok,现在就可以在第二 Activity 上看到发送过来信息了。如图:

firstapp

到此为止,已经创建好我们的第一个 Android 应用了!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章