本例源码:/Files/mshwu/L3_simpleinterface2.rar
上一节,一个最简单的Activity,包括一个text field,跟一个按钮,这一节将响应该button的事件,开启另一个Activity。
Response to the Button
对Button事件的响应,也可以通过配置来完成,
在layout定义文件activity_main.xml中添加android:onclick 于<button>组件中:
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="sendMessage"
android:text="@string/button_send" />
或可视化编辑环境中如下图所示:
属性的值 SendMessage就是事件监听器的响应方法,当button被点击时,activity 中的SendMessage方法将会被调用,
方法结构:
/** Called when the user selects the Send button */
public void sendMessage(View view) {
// Do something in response to button
}
Tip:In Eclipse, press Ctrl + Shift + O to import missing classes
通常事件监听器的响应方法必须满足:
- 必须是public 的
- 返回 void 值
- 唯一的参数view(被点击的view)
下面,我们将通过这个方法,读取text field 的值,传给另一个activity.
Build and Intent
intent 是一种对两种不同的组件提供运行时绑定的Object(比如两个activity),Intent理解为应该程序 “intent to do something”,Intent 可被广泛应用于不同的任务,用的最多就是用于开启另一个activity,
在我们的响应方法里,创建一个intent,用于开启另一个Activity叫DisplayMessageActivity,
Intent intent = new Intent(this, DisplayMessageActivity.class);
构造方法有两个参数:
第一个是Context,因为Activity 是这个类的一个子类。
第二个是Class,Intent 将把信息发送到这一组件,在这个例子,新的Activity将会被开启。
Intent 不但可以帮你开启另一个Activity,还可以传递捆绑的多种数据类型给新的Activity, 通过findViewById(API:Finds a view that was identified by the id attribute from the XML that was processed in onCreate(Bundle)
.)方法查找到EditText对象,并且把它的内容添加到intent中:
Intent intent=new Intent(this,DisplayMessageActivity);
EditText editText = (EditText) findViewById(R.id.edit_message);
String message = editText.getText().toString();
intent.putExtra(EXTRA_MESSAGE, message);
Intent 捆绑的多种数据类型是用一种key-value对的形式,叫Extra, 方法putExtra(key, value)把数据按key – value捆绑到Intent 中,
EXTRA_MESSAGE是我们定义的一个常量,当做key来使用,用你的包名前缀来做为定义Extras的key会是一个比较不错的习惯,因为你的程序要与别的程序打交道,可以确保你的KEY的唯一性。
Start the second Activity
我们需要调用startActivity()方法,传递intent进去开启一个新的Activity, 当系统接收到这些信息时,就会开启一个Intent所描述的Activity的新的实例,现在,完整的响应方法如下:
/** 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(EXTRA_MESSAGE, message); startActivity(intent); }
现在为了让程序能跑起来,我们必须创建另一个新的Activity类DisplayMessageActivity。
Create the second Activity
在src/<package-name>/
directory 新建类DisplayMessageActivity.java,
在类里,添加方法 onCreate:
public class DisplayMessageActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } }
所有的Activity子类必须回调父类的onCreate方法,当你创建一个新的Activity实例时,系统会调用这一个方法,这里可以实现Activity layout,初始化必要的activity组件。
Add it to the manifest
所有的Activity必须在AndroidManifest.xml中有定义,这一文件可以理解成WEB中的WEB.XML
Receive the Intent
所有的Activity都是由intent触发,我们可以通过activity的方法getIntent()得到触发你的activity的Intent,从而也可以得到它所捆绑的数据,
在DisplayMessageActivity
类的onCreate方法里, 得到intent实例从面提取第一个Activity发送的
信息:
Intent intent = getIntent();
String message = intent.getStringExtra(EXTRA_MESSAGE);
Display the Message
创建一个textview,用于显示信息,勇过setContentView()方法把TextView设为Activity布局的根View
完整的onCreate方法在第二个activity中:
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Get the message from the intent Intent intent = getIntent(); String message = intent.getStringExtra(EXTRA_MESSAGE); // Create the text view TextView textView = new TextView(this); textView.setTextSize(40); textView.setText(message); setContentView(textView); }
运行效果:
Click Send button
到此,你的第一个应用程序创建完成