Android开发第1-4课:启动另一个Activity

本课教会教

  1. 相应发送按键
  2. 构建一个Intent
  3. 启动另一个Activity
  4. 创建第二个Activity
  5. 接受Intent
  6. 显示信息

完成了上一节课的内容,你已经拥有了一个app,它可以显示一个activity (单个屏幕),里面有文本编辑区和一个按键。 在本课中,你将会在MainActivity中添加一些代码,使得用户点击Send按钮时启动一个新的activity。

响应Send按键

为了响应按键的点击事件,打开activity_main.xml布局文件并且添加android:onClick 属性到<Button> 元素中:

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

截图如下:

Android开发第1-4课:启动另一个Activity_第1张图片

这个android:onClick 属性的值,"sendMessage",就是按键单击处理函数名。

打开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 可以加载缺少的类(Cmd + Shift + O on Mac)。

添加代码前截图:

Android开发第1-4课:启动另一个Activity_第2张图片

添加代码后截图:

Android开发第1-4课:启动另一个Activity_第3张图片

.java文件中的按键处理函数名必须和.xml文件中的onClick属性的值一致,而且,按键处理函数必须满足以下条件:

  • 属于公有函数
  • 有一个void型的返回值
  • 有且只有一个 View 参数 (这就是将被点击的View )

接下来,你将会填充这个函数来读取文本编辑区的内容,并且将它发送到另外一个activity。

构建一个Intent

一个 Intent 就是一个对象,提供在运行时绑定分开的组件的服务(例如两个activity)。 这个 Intent 代表一个app "意图做某事" 。你可以使用intent来实现各种任务,但通常情况下它被用于启动另外一个 activity。

sendMessage()方法里面,创建一个 Intent 来启动一个activity,叫做DisplayMessageActivity

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

截图如下所示:

Android开发第1-4课:启动另一个Activity_第4张图片

这里的构造函数使用了两个参数:

  • 一个 Context 作为第一参数(因为Activity 类是Context 的一个子类)
  • 系统将要递送Intent到的app组件的类 (这时activity应该已经启动)

注意: 在例IDE中引用DisplayMessageActivity将会出现错误,例如Eclipse,因为这个还没有存在。现在先不管它,下面将会创建这个类。

一个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.Intent和android.widget.EditText的声明。 将会定义一个EXTRA_MESSAGE常量。

截图如下所示:

Android开发第1-4课:启动另一个Activity_第5张图片

一个Intent 可以携带许多数据类型作为关键值对,叫做extras。 这个putExtra() 方法的第一参数是使用关键名字,第二个方法是其值。

为了使得下一个activity可以查询extra数据,你应该用一个公共常量来定义你的extra的key。所以在MainActivity类的顶部添加EXTRA_MESSAGE的定义

public classMainActivityextendsActivity{  
        publicfinalstaticString EXTRA_MESSAGE="com.example.myfirstapp.MESSAGE";  
       ...
}

截图如下:

Android开发第1-4课:启动另一个Activity_第6张图片

用你的app包的名字的前缀来为你的intent extras定义key是一个很好的习惯。这保证了当你的app和其它app交互时,它们是独一无二的。

启动第二个Activity

为了启动一个activity, 调用 startActivity()并且传递你的Intent。系统接受这个调用并且启动一个Intent定义的Activity 实例。

完整的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);
}

截图如下所示:

Android开发第1-4课:启动另一个Activity_第7张图片

为了使得这个方法能够正常工作,你需要创建DisplayMessageActivity类。

创建第二个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

Android开发第1-4课:启动另一个Activity_第8张图片

Figure 1. The new activity wizard in Eclipse.


如果你使用其他的IDE或者命令行,在工程的src/目录下紧跟着MainActivity.java创建一个DisplayMessageActivity.java文件。

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

  • 这个类中已经包含了所需的 onCreate()方法的一个实现。
  • 此外,它还包含了一个onCreateOptionsMenu() 方法的实现,但是这个app中并不需要,因此你可以将其删除。
  • 最后,它还包含了一个onOptionsItemSelected() 的实现,它用于处理action bar的Up行为。这个保持原装即可。

由于 ActionBar APIs 在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,使用上面都的代码来更新你的 DisplayMessageActivity类。

部分截图:——和上面的代码有点出入,这里新添加了一个setupActionBar()函数,然后在里面做版本检查;另外,在我的版本中,添加@SuppressLint("NewApi")将会导致编译不通过。因此最后我把它删了。

Android开发第1-4课:启动另一个Activity_第9张图片


 Activity  的所有子类都必须实现onCreate()方法。当创建一个新的actiity实例时,系统就调用这个函数。 这个函数就是你必须使用setContentView() 定义activity布局的地方,也是你执行activity组件初始化的地方。

注意: 如果你使用其它的IDE,你的工程将没有setContentView() 所需的activity_display_message布局。这没所谓的,因为你将会更新这个方法,而这个布局也用不上。

添加标题字符串

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

如果你使用的是其他IDE,添加如下标题到strings.xml文件中:

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

添加到清单

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

当你使用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开发第1-4课:启动另一个Activity_第10张图片

 android:parentActivityName 属性声明了这个activity的父activity的名字。 系统使用这个值来实现默认的导航行为,例如Android 4.1 (API level 16)或者更高版本中的Up navigation 。你可以使用 Support Library 并且添加如上所示的  <meta-data>  元素来为一些旧版本的Android提供导航。

注意: 你的 Android SDK 应该已经包含了最新的Android支持库。 它已经包含在ADT绑定包里面,但是如果你使用其他IDE,你应该在Adding Platforms and Packages 中安装他它。当你使用Eclipse中的模版,支持库自动的添加到你的app工程中(你可以在Android的依赖关系中看到库的JAR文件)如下图所示。如你不使用Eclipse,你需要手动添加这个库到你的工程中—按照setting up the Support Library的向导。

Android开发第1-4课:启动另一个Activity_第11张图片

如果你使用Eclipse进行开发,你现在可以运行你的app了。但是没有太多效果。点击Send按键启动第二个activity,但是它使用模版提供的默认的 "Hello world"布局。你将会更新这个activity来显示定制的内容,所以如果你使用不同的IDE也不要担心这个app编译不过。

接收Intent

每个 Activity都被一个Intent 调用, 不管用户如何操作。你可以在启动activity的时候通过调用getIntent()获得Intent ,然后查询里面的数据。

DisplayMessageActivity 类的onCreate()方法里面,,获取intent然后抽取出MainActivity传过来的信息

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

截图如下

Android开发第1-4课:启动另一个Activity_第12张图片

显示信息

为了在屏幕上现世信息,创建一个 TextView 窗体并且使用setText()设置文本。 然后添加TextView ,并且通过将其传递给setContentView()使其作为当前activity布局的t根视图。

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

截图如下:

Android开发第1-4课:启动另一个Activity_第13张图片

现在你可以运行这个app了。当它打开的时候,在本文编辑框中输入信息,然后点击发送,你就可以看到信息显示在第二个activity中。

Android开发第1-4课:启动另一个Activity_第14张图片

Figure 2. Both activities in the final app, runningon Android 4.0.

就是他,你已经建立了你的一个Android app了!

想学习更多的Android app编程,请继续学习接下来的基础训练课程。下一个课程是管理Activity的生命周期。

你可能感兴趣的:(eclipse,android)