[安卓教学] 建立你的第一个安卓应用 - 第四课 - 启动另一个activity

在完成上节课后,你有了能够显示包含一个文字输入框和一个按钮的activity(一个屏幕)的应用。在这节课中,你将在“MainActivity”类中添加一些代码,使得在用户点击“Send”按钮时,启动另一个新的activity。(译者注:activity可能能够翻译成“活动”,可是由于是安卓开发的专业术语,就不翻译了。)。html

响应“Send”按钮

要响应此按钮的“on-click”事件(event),打开“fragment_main.xml”布局文件,而后在<Button>”节点内添加“android:onClick”属性。
java

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

android:onClick”属性的值,“sendMessage”,是当用户点击按钮时系统将会调用的你的activity中的一个方法(method)。
android

打开“MainActivity”类(在项目中的“src/”目录下),而后添加相应的方法:编程

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

为了是系统能够匹配此方法和“android:onClick”所指定的方法名,方法签名(signature)必须如上所示。更明确的说,此方法必须:
app

  • 是公开的(public)ide

  • 返回值是“void”函数

  • 有且仅有一个“View”类型的参数(这将是点击事件所发生的View工具

下一步,你将读取文字输入项中的内容,而且发送读取的文本到另外一个activity。
布局

建立一个“Intent”(意图)

Intent”(意图)是提供运行时绑定不一样构件(好比,两个activities)的对象。“Intent”表述一个应用“意图去作某件事”。你能够用“Intent”实现各类各样的任务,可是最常常的是用来启动另外一个activity。
学习

在“sendMessage()”方法内部,建立一个启动名为“DisplayMessageActivity”的activity的“Intent”:

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

这须要你导入(import)“Intent”类:

import android.content.Intent;

提示:在Eclipse中,同时按下“Ctrl + Shift + O”能够自动导入缺失的类(在Mac中是“Cmd + Shift +O”)。

此处用到的构造函数(constructor)须要两个参数(parameters):

  • 第一个参数为一个“Context”类型的对象(这里使用了“this”对象,由于“Activity”类是“Context”类的子类)

  • 以及须要系统将此“Intent”递送的到的应用构件(component)的类(Class)(此例中为要启动的activity的类)

注意:若是你在使用Eclipse或者其余的集成开发环境,引用“DisplayMessageActivity”到致使一个错误提示,由于这个类还不存在。目前,先忽略这个错误;你将很快创建此类。

一个“Intent”不只可以让你启动一个“activity”,他同时还能够携带数据集(bundle)到另外一个“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.widget.EditText”类。你很快会定义“EXTRA_MESSAGE”常量。

一个“Intent”能够经过一组叫作“extras”(额外数据)的键值对(key-value pairs)来携带多种类型的数据。“putExtra()”方法接收第一个参数做为键值,第二个参数为对应的数据值。

为了使其余的activity能够查询这些额外数据(extra data),你应该使用一个公有常量(public constant)来定义此intent的键值。所以,在“MainActivity”类的最开始,添加“EXTRA_MESSAGE”的定义:

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

通常来讲,使用你的应用的包名称做为intent额外数据(extra)的键值前缀是一个好的习惯作法。若是你的应用要和其余应用交互,这样能够保证他们是惟一的。

给其余应用发送intent

咱们此节课建立的intent叫作“显式intent”(explicit intent),由于这个“Intent”指定了须要发送到的应用构件(app component)。同时,intend也能够是“隐式”的(implicit),此类“Intent”不会指定一个肯定的构件(component),可是容许安装在当前设备上的任何应用响应此intent,只要它们能够知足在“Intent”的不一样参数中指定的各类元数据规范(meta-data specification)。更多的信息,请参阅课程“Interacting with Other Apps”。

启动第二个Activity

要启动一个activity,调用“startActivity()”方法而且传入你的“Intent”做为参数。系统接收到这个调用后,会启动一个在此“Intent”中指定的“Activity”的实例(instance)。

随着新的代码加入,完整的“sendMessage()”方法以下,此方法将被“Send”按钮调用:

/** 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

在Eclipse中建立一个新的activity:

  1. 点击工具栏上的“New”

  2. 在所显示的窗口中,打开“Android”目录,而后选择“Android Activity”。点击“Next”。

  3. 选择“BlankActivity”而后点击“Next”。

  4. 填入activity的详细信息:

    • Project(项目):MyFirstApp

    • Activity Name(activity名称):DisplayMessageActivity

    • Layout Name(布局名称):activity_display_message

    • Fragment Layout Name(“碎片”名称:译者注:“碎片”是Android的新特性,之后将会介绍):fragment_display_message

    • Title(标题):My Message

    • Hierarchial Parent(层次关系中的父构件):com.example.myfirstapp.MainActivity

    • Navigation Type(导航类型):None

    点击“Finish”。

图示1:Eclipse中的新建activity向导

若是你在使用其余的IDE或者命令行工具,在项目的“src/”目录中,建立一个名为“DisplayMessageActivity.java”的文件,使之与已存在的“MainActivity.java”在一块儿。

打开“DisplayMessageActivity.java”文件。若是你是使用Eclipse建立的:

  • 这个类已经包含了一个“onCreate()”方法的实现。你随后将更新这个方法的实现。

  • 其中还有一个“onCreateOptionsMenu()”方法的实现,可是在此应用中,你不须要它。因此你能够删除它。

  • 其中还有一个“onOptionsItemSelected()”方法的实现,此方法处理操做栏(action bar)中的“向上”(Up)行为。保留原样。

  • 其中还有一个继承自“Fragment”的“PlaceholderFragment”类。在此activity的最终版本中,你不须要这个类。

“Fragments”(碎片,这个也是Android的专用名词,之后将不翻译)能够将应用的功能和用户界面(UI)分解为可重用的模块。须要“fragment”的更多信息,请参阅“Fragments API Guide”。此activity的最终版本将不使用fragment。

如今的“DisplayMessageActivity”类应该以下:

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

若是你使用Eclipse以外的其余IDE,使用上述代码更新“DisplayMessageActivity”类。

全部“Activity”的子类必须实现“onCreate()”方法。当系统建立一个此activity的新实例的时候,将调用此方法。这个方法就是你使用“setContentView()”方法定义activity布局和为activity的各个构件(components)初始化设置(initial setup)的地方。

注意:若是你使用Eclipse以外的IDE,你的项目没有“setContentView()”所需的“activity_display_message”布局文件。由于你随后会更新此方法清且不会使用此布局,因此这不会成为问题。

添加标题字符串(string)

若是你使用Eclipse,你能够直接跳到下一章节,由于建立activity模板为新的activity提供了标题字符串。

若是你使用Eclipse以外的IDE,在“strings.xml”文件中添加新activity的标题:

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

添加到清单文件(manifest)

全部的activity必须使用“<activity>”元素在“AndroidManifest.xml”文件中声明。(译者注:manifest在Java以及Android编程中都是经常使用的术语,此类文件通常是用来对资源和代码进行说明和描述。)

若是你使用Eclipse建立此activity,它会建立一个缺省项。若是你使用其余IDE,你须要本身添加此manifest项。它应该以下:

<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。系统经过这个值来实现缺省的导航行为,好比在Android 4.1(API level 16)以及更新版本中的“向上导航”(Up navigation)。你可使用“Support Library”(兼容支持类库,译者注:这个类库提供了让旧版本的Android支持新的功能的一系列帮助类和方法)而且添加如上所示的“<meta-data>”元素的方法在旧版Android中提供一样的导航行为。

注意:你的Adroid SDK应该已经包含了最新版本的Adroid Support Library。它包含在ADT捆版软件包中,可是若是你使用其余IDE,你应该已经在“Adding Platforms and Packages”这个步骤安装了它。当使用Eclipse的模板时,“Support Library”会自动被添加到你的项目中(你能够在“Android Dependencies”列表中看到此类库的jar文件)。若是你不使用Eclipse,你须要手动添加此类库到你的项目中——跟随“setting up the Support Library”向导去作,而后返回这里。

若是你使用Eclipse开发,你如今能够运行这个应用,但不会有什么特别的发生。点击“Send”按钮,能够启动第二个activity,可是这个activity使用建立模板中提供的缺省“Hello World”布局。你将很快更新这个activity使用一个自定义的文本视图组件(text view)来取而代之,因此,若是你使用其余IDE,不要担忧这个应用还不能被编译经过。

接收Intent

每一个Activity都是被一个Intent所调用的,无论用户是如何被导航到那里的。你能够调用“getIntent()”方法来得到启动你的activity的Intent,而后获取包含于之中的数据。

在“DisplayMessageActivity”类的“onCreate()”方法中,获取这个intent而且读取“MainActivity”发送的消息。

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

显示消息

要在屏幕上显示这则消息,须要建立一个“TextView”部件(widget)而后经过“setText()”方法设置它的显示文字。所以,经过“setContentView()”方法,将“TextView”添加到布局中做为activity的根视图元素。

完整的“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:在Android 4.4中,完成版应用中的两个activity。

如是,你已经完成了你的第一个Android应用(app)!

想学习更多,请跟随连接到下一课程。

此文章总体或部分翻译自Android Open Source Project的文档。依照Creative Commons 2.5 Attribution License使用并分享。此文章(译文,中文)原始连接为“[安卓教学] 建立你的第一个安卓应用 - 第四课 - 启动另一个activity”。原文(英文)连接为“Starting Another Activity

< 上一课 课程介绍 下一课 >
相关文章
相关标签/搜索