前面一个教程我们已经在屏幕上显示了一个文本域和一个按钮,现在你要在MainActivity中添加一些代码,实现当用户点击按钮的时候启动一个新的Activity。
响应Send按键
为了响应按键的点击事件,打开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中的一个函数名称,当你点击这个按钮的时候,这个函数就会被调用。
打开MainActivity类添加相应的函数:
/** 当用户点击Send按钮的时候被调用 */
public void sendMessage(View view){
//响应点击事件
}
系统会自动匹配对应的函数名去响应android:onClick,所以名称必须是准确的,而且,方法必须符合下面的条件:
- 必须的public的
- 必须有一个void的返回值
- 必须仅有一个View作为参数(这个view就是被点击的那个)
下一步,你要在这个函数中实现读取文本域的内容,然后发送这个内容给另外一个activity。
创建一个Intent
一个Intent是一个对象,它为两个独立的组件提供运行时绑定(比如两个activity)。一个Intent就代表一个程序“想要去做什么”,你可以使用它完成很多任务,不过最常用的就是启动另外一个activity。
在sendMessage()函数中,创建一个Intent去启动DisplayMessageActivity:
Intent intent = new Intent(this, DisplayMessageActivity.class);
这个构造函数使用两个参数:
- 第一个参数是一个Context(使用this是因为Activity类是Context类的子类)
- 系统需要传递Intent给一个组件的Class(这里的情况是这个activity会被启动)
提示:这个时候Eclipse中会提示一个DisplayMessageActivity引用错误,因为这个类还不存在,先忽略这个错误,我们马上就要创建这个类了。
一个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(EXTRA_MESSAGE, message);
一个Intent可以携带各种各样类型的数据集,以key-value对的方式。putExtra()函数的第一个参数就是key,第二个参数就value。
为了下一个activity能够查询到传递过来的附加值,你需要定义key为一个公共的常量。所以在MainActivity类的顶部添加EXTRA_MESSAGE的定义:
public class MainActivity extends Activity {
public final static String EXTRA_MESSAGE = "com.example.myfirstapp.MESSAGE";
……
}
使用程序的包名作为intent附加数据的key的前缀是一种很好的方式。这样可以确保当你的程序和其他程序交互的时候,它们是唯一的。
启动第二个Activity
要启动一个activity,你只要调用startActivity()函数,并传递你的Intent就可以了。系统接收到这个调用,然后启动Intent中指定的Activity的实例。
最新的sendMessage()函数的代码如下:
/** 当用户点击Send按钮的时候被调用 */
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:
- 点击工具栏上面的New图标
![]()
。
- 在出现的窗口中,打开Android文件夹,选择Android Activity,点击Next。
- 选择BlankActivity然后点击Next。
- 填写activity信息:
Project: MyFirstApp
Activity Name: DisplayMessageActivity
Layout Name: activity_diaplay_message
Navigation Type: None
Hierarchical Parent: com.example.myfirstapp.MainActivity
Title: My Message
点击Finish。
如果你使用其他的IDE或者使用命令行,创建一个名为DisplayMessageActivity.java的文件,放到和MainActivity.java相同的目录中。
打开DisplayMessageActivity.java文件,如果你使用eclipse,这个类以及包含了必要的onCreate()函数,这里也包含了onCreateOptionsMenu()函数的实现,我们还不需要它,你可以删除它,类大概是这样的:
public class DisplayMessageActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_display_message);
}
}
所有Activity的子类都必须包含onCreate()函数的实现。当系统创建一个新的activity实例的时候会调用这个函数。这个函数是你定义activity的视图布局和进行组件初始化的地方。
把它添加到清单文件
你必须在清单文件AndroidManifest.xml中使用<activity>元素声明所有的activity。
如果你使用Eclipse工具创建activity,那么已经默认添加好了:
<application
……
<activity
android:name=".DisplayMessageActivity"
android:label="@string/title_activity_display_message" >
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="com.hebaijun.myfristapp.MainActivity" />
</activity>
</application>
这个<meta-data>元素使用程序的逻辑层次声明了这个activity的父activity的名称。Android支持库使用这种方式实现默认的导航行为,比如
Up navigation
.
提示:在安装的时候,你应该已经下载了最新的支持库,Eclipse会自动包含到你的项目中(你看在JAR文件列表中看到Android Dependencies),如果不是使用eclipse,你需要手动添加这库到你的工程中,教程在这里 setting up the Support Library
.
现在第一个activity中的Intent已经可以找到DisplayMessageActivity类了,所以程序可以运行了。当你运行程序,点击Send按钮启动另一个activity,但是页面还什么都不会显示。
接收Intent
不管用户是怎么导航到这里的,每个Activity都是被一个Intent调用的。你可以通过getIntent()函数取得启动你的那个activity使用的Intent,并且可以取得里面的附加值。
在DisplayMessageActivity类的onCreate()函数中,取得MainActivity传递过来的Intent和附加的message。
Intent intent = getIntent();
String message = intent.getStringExtra(MainActivity.EXTRA_MESSAGE);
显示Message
为了显示message到屏幕,你需要创建一个TextView部件,然后使用setText()方法设置它的值。再然后通过setContentView()方法把这个TextView设置为这个activity部件的根视图。
完整的onCreate()函数如下:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//从Intent中取得messge
Intent intent = getIntent();
String message = intent.getStringExtra(MainActivity.EXTRA_MESSAGE);
//创建text view
TextView textView = new TextView(this);
textView.setTextSize(40);
textView.setText(message);
// 设置textview为activity的布局
setContentView(textView);
}
你现在可以运行程序了,输入一个message到文本框中,点击Send按钮,这个message就会显示在另外一个activity中了。
就这样,你已经创建好你的第一个Android程序了。
想要学习更多,请跟随我们的教程学习。下一个课程是:Activity生命周期的管理。