在你学习完成上一节的内容,你有一个自己的APP,它是一个单个界面的APP,有一个文字域和按钮,在
这一节我们将增加一些代码到MainActivity,它将开启一个新的界面,当用户点击Send Button。
一 Send Button的响应
当你点击send_button时,有一个on-click事件,打开activity_main.xml布局文件,增加android:onClick属性
到<Button>元素。
android:onClick的属性值,sendMessage,是你的活动的方法的名称,当你点击按钮,系统将调用这个函数。
打开MainActivity类,src/目录下,增加方法,而且需要导入一个View类,如下:
为了让系统匹配这个方法到给定的android:onClick设置的方法,方法必须具备如下的条件:
1)必须是public类型
2)方法返回值为void
3)仅仅有一个View的入参,(这个例子的View是Button)
下面,我们将编写这个方法,这个函数读textField输入的字符,将它发生到另外一个活动。
二 建立一个Intent
Intent是一个对象,这个对象提供运行时的两个组件的绑定(例如两个活动之间)。Intent
代表一个应用程序的“尝试做一些事情”。你可以在多种任务中使用Intent,但是大多数情况下
他们使用它去启动另外一个活动。
在sendMessage函数里,创建一个Intent去开始一个活动,叫做DisplayMessageActivity:
// 增加的内容
public void sendMessage(View view){
// Do something in response to button
Intent intent = new Intent(this, DisplayMessageActivity.class);
}
DisplayMessageActivity:
构造器使用两个参数:
1)Content作为第一个参数,(this备用是因为这个Activity类似一个Content的子类)
2)Intent被投机到那个APP的组件类(这个例子,)
注意:如果你使用IDE例如Eclipse将产生一个错误,因为这个类还不存在,现在忽略这个
错误,你后面将创建这个类。
一个Intent不仅仅允许你启动另外一个Activity,而且你可以运送一个投机数据到Activity。
在sendMessage()方法里,使用findViewById()去获取EditText元素,增加它的text内容到
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常量。
Intent可以携带各种不同类型的数据,数据类型是key-value类型的,叫做extras。putExtra方法是带着keyName
作为第一个参数,Value作为第二个参数。
为了下个一个Activity能够查找到extra数据,你应该为你的Intent的extra定义一个key,作为一个公共常量。所以
增加EXTRA_MESSAGE定义在MainActivity类顶部。
通常一个好的习惯是使用你的应用程序包的名称作为前缀定义KEY.这样可以使得他们是唯一的命名。
二 开始第二个活动
要启动一个Activity,调用startActivity()函数,并把它传递给Intent,系统接收调用,并且启动一个Activity实例,这个Activity被Intent指定。
有了这个新的代码,完整的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); }为了使这个能够工作,现在你需要创建这个 DisplayMessageActivity 类。
三 创建第二个Activity
使用Eclipse传教一个新的Activity:
1)在工具栏点击New
2) 会出现一个窗口,打开Android文件夹,选择Android Activity,点击下一步
3)选择BlankActivity点击下一步
4)填写Activity的细节
(1)Project:My
(2)Activity Name:DisplayMessageActivity
(3)Layout Name:activity_display_message
(4)Title:My Message
(5)Hierarchial Parent:com.example.my.MainActivity
(6)Navigation Type:None
点击完成
如果你正在使用不同的IDE或命名行工具,创建一个新的文件,命名为DisplayMessageActivity.java在你的工程中
src/文件夹中。
打开DisplayMessageActivity.java文件,如果你使用Eclipse创建这个Activity:
1)这个类以及包含了一个需要的onCreate()方法
2)也有一个onCreateOptionMenu()方法的实现,但是如果你不需要,你可以从你的APP中删除它。
3)还有一个onOptionItemSelected()的实现,它用于处理操作栏的Up行为。请记住这个事情是这样的。
因为ActionBar API仅仅在HONEYCOMB和更高的版本中可用,你必须在添加getActionBar()方法的时候检查当前平台
的版本。另外你必须增加@SuppressLint("NewApi")标签到onCreate()方法去避免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类为上面的代码。
所有的Activity的子类必须实现onCreate()方法。当创建一个新的Activity的实例时系统调用这个。
四 增加一个标签字符串
你若使用Eclipse工具,你可以跳过这个小节,以为模板已经提供了一个标题字符串为你的新Activity。
若你使用其他的IDE工具,增加新的Activity的标题到你的strings.xml文件
<resources> ... <string name="title_activity_display_message">My Message</string> </resources>查看Eclipse的strings.xml如下
显然已经有了这个字符串
五 增加这个Activity到manifest
所以的Activity必须在你的manifest文件中声明,AndroidManifest.xml,使用一个<Activity>元素
当你使用Eclipse工具创建这个活动,这个已经默认创建。如图所示:
你若使用其他工具,你需要增加它到manifest中,
添加完毕后manifest看起来如下:
<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>在调试器上循序如下:
在APP中输入字符串:
点击Send按钮
六 接受Instent
每一项活动被一个Intent调用,无论用户如何如何导航。你可以获取这个Intent,它通过getIntent()函数启动你的Activity和接受数据。
在DisplayMessageActivity类的onCreate()方法,获取Intent和通过MainActivity传教消息:
Intent intent = getIntent(); String message = intent.getStringExtra(MainActivity.EXTRA_MESSAGE);七 显示消息
为了在屏幕上显示消息,创建一个TextView窗口,设置字符串使用setText()函数,然后增加TextView
作为根视图通过setContentView()函数传递它。
@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); }然后运行APP查看如下:
输入字符串
输入字符串
点击按钮
完毕!