学完上一节,构建一个简单的用户界面,我们完成了一个这样的简单界面,
这一节中,我们学习如何给按钮添加事件,来启动另外一个Activity。
1、给发送按钮添加一个响应事件
首先,找到main.xml文件,在
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中使用
因为DisplayMessageActivity
是我们通过直接的Intent启动的,所以它不需要intent过滤器,就像你在MyFirstActivity声明中看到的那样。这里DisplayMessageActivity的声明只需要在
... >
android:name="com.example.myapp.DisplayMessageActivity" />
...
现在我们的应用是可运行的了,你可以运行我们的应用,点击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); }现在我们可以运行程序,查看效果了: