启动另外一个Activity

本文详细介绍了如何在Android应用中给按钮添加事件,启动另一个Activity。包括在XML布局文件中配置按钮的响应事件,创建Intent对象并启动目标Activity,以及在目标Activity中接收和显示Intent传来的数据。

学完上一节,构建一个简单的用户界面,我们完成了一个这样的简单界面,



这一节中,我们学习如何给按钮添加事件,来启动另外一个Activity。


1、给发送按钮添加一个响应事件

首先,找到main.xml文件,在<Button>元素的属性中添加android:onClick属性如下:

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/button_send"
    android:onClick="sendMessage" />
android:onClick属性的值sendMessage,就是当你点击按钮想要启动的那个方法的方法名。


然后,在你的Activity中添加如下方法:

/** Called when the user selects the Send button */
public void sendMessage(View view) {
    // Do something in response to button
}
Tips: 在eclipse中可以通过同时按下 ctrl+shift+O 组合键的方式导入未添加的方法(Mac:Cmd + shift + O)


注意: 为了系统能够正确的匹配此方法,我们在定义方法的时候需要注意以下几点:

1)方法是public的;

2)方法返回值为void;

3)有一个View类型的唯一参数(此View就是我们所点击的组件)


2、创建一个Intent

一个Intent是这样一个对象,它能提供两个分离的组件之间的运行时连接,例如两个Activity之间。一个Intent代表着一个app想要做某件事的意图。我们能用Intent完成很多种任务,但是大多数时候它都用来启动另外一个Activity。

现在我们在sendMessage方法中创建一个Intent,去启动另外一个名为DisplayMessageActvity的Activity:

Intent intent = new Intent(this, DisplayMessageActivity.class);
这里Intent的构造方法接受两个参数:

1)第一个参数为Context(因为Activity是Context的子类,所以我们这里使用this);

2)app组件的Class对象,它就是我们要传送Intent的目的地。


使用Intent不仅可以启动另外一个Activity,而且能够给Activity携带一些数据。通过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("message", message);
Intent能够传送多种数据类型的键值对的集合。putExtra的第一个参数为字符串类型的键值,value为第二个参数。

以上我们所使用的Intent可以称为“直接的Intent”,因为它指明了具体接受Intent的app组件。与它相对应的是一种“间接的Intent”,在这种Intent中不会明确指出要启动的组件,而是允许设备上所有满足条件的app去响应这个Intent。这个条件就是指定Intent动作时所添加的meta-data声明。


3、启动第二个Activity

为了启动一个Activity,我们只需简单的调用startActivity(),并且把它交给你的Intent。系统接收到这个调用,就会去启动Intent中所指明的Activity的一个实例。

现在,完整的sendMessage()方法如下:

/** Called when the user selects 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("message", message);
    startActivity(intent);
}
然后去创建我们要启动的DisplayMessageActivity,并添加onCreate方法:

public class DisplayMessageActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }
}
所有Activity的子类,都必须实现onCreate方法。当创建一个Activity实例的时候,系统会首先调用此方法。我们必须在这个方法中定义Activity的布局。同时完成一些必要的初始化工作。

我们必须在AndroidManifest.xml中使用<Activity>标签声明我们所定义的所有Activity。

因为DisplayMessageActivity 是我们通过直接的Intent启动的,所以它不需要intent过滤器,就像你在MyFirstActivity声明中看到的那样。这里DisplayMessageActivity的声明只需要在<application>标签中的一行就够了:

<application ... >
    <activity android:name="com.example.myapp.DisplayMessageActivity" />
    ...
</application>
现在我们的应用是可运行的了,你可以运行我们的应用,点击send按钮启动第二个Activity。但是第二个Activity启动之后什么也不显示。


4、在第二个Activity中接受并显示Intent的内容

每一个Activity都是用Intent触发的,所以我们可以在Activity中调用getIntent()得到Intent和包含在其中的数据。

现在我们在DisplayMessageActivity的onCreate方法中取得Intent,并得到其中的数据:

Intent intent = getIntent();
String message = intent.getStringExtra("message");
这里的键值"message",建议使用一个定义的常量字符串代替,以保证它的唯一性,例如:

public final static String EXTRA_MESSAGE = "com.example.myapp.MESSAGE";
那我们就可以使用MyFirstActivity.EXTRA_MESSAGE来代替“message”作为键值了。


为了在屏幕上显示这个字符串,我们创建一个TextView,并使用setText(),把message字符串设置为它的值,然后使用TextView作为此Activity的根视图传递给setContentView(),完整的onCreate()方法如下:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // Get the message from the intent
    Intent intent = getIntent();
    String message = intent.getStringExtra(MyFirstActivity.EXTRA_MESSAGE);

    // Create the text view
    TextView textView = new TextView(this);
    textView.setTextSize(40);
    textView.setText(message);

    setContentView(textView);
}
现在我们可以运行程序,查看效果了:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值