1.4启动另一个活动
完成上一课后,你有一个应用程序可以显示带有文本字段和一个按钮的活动(单屏)。在这一课中,您将在MainActivity
中
添加一些代码,使得用户点击“发送”按钮时能启动一个新的活动。
响应“发送”按钮
为了响应按钮的点击事件,打开 activity_main.xml
布局文件并添加android:onClick 属性到<Button>元素:
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/button_send"
android:onClick="sendMessage" />
android:onClick 属性的值“sendMessage”
,是用户单击按钮时系统调用的你的活动中的方法名称。
打开MainActivity
类(位于项目的 src/
目录),并添加相应的方法:
/** Called when the user clicks the Send button */
public void sendMessage(View view){
// Dosomething in response to button
}
这需要你导入视图类:
import android.view.View;
提示:在Eclipse中,按Ctrl + Shift +O导入缺少的类(CMD+ SHIFT + O在Mac)。
为了让系统匹配这个方法和android:onClick的方法名,签名必须完全如上所示。具体来说,该方法必须:
· 公共的
· 有一个void返回值
· 有一个视图作为唯一的参数(被点击的是视图)
接下来,您将填写这个方法来读取该文本字段的内容,并提供该文本到另一个活动。
建立一个Intent
一个意图是提供单独的组件(如两个活动)之间的运行时绑定的对象。意图表示一个应用程序“想做一些事情。” 您可以使用意图实现多种任务,但多数情况下,他们用来启动另一个活动。
在SendMessage
()这个
方法里面,创建一个启动活动的名称为DisplayMessageActivity
的意图:
Intent intent= new Intent(this,DisplayMessageActivity.class);
这里使用的构造函数有两个参数:
· 上下文作为第一个参数(这
是因为活动
类是上下文
的
一个子类)
· 应用程序的组成部分的类,它是系统要传达的意图
(在这种情况下,应启动的活动)
向其他应用程序发送意图
在这一课中创建的意图是,称为显式意图,因为它指定意图需要的特定的应用程序组件。然而,意图也可以是隐式的,在这种情况下,意图并没有指定所需的组件,但允许在设备上安装的任何应用程序响应这个意图,只要这些应用程序满足元数据(meta-data)的动作(action)的规格,那些动作由不同的意图参数来规定。欲了解更多信息,请参阅教程与其他应用程序交互。
注:如果您使用的是IDE,比如Eclipse,对DisplayMessageActivity
的引用
将增加一个错误,因为这个类尚不存在。现在忽略这个错误,你很快就会创建这个类。
意图不仅可以让你启动另一个活动,它还可以把一束数据带到这个活动。在SendMessage
()
方法中,使用findViewById()方法得到EditText元素,并把它的文本值添加到意图:
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
常量
。
意向可以键-值对的方式带上各种数据类型,叫extra。putExtra()方法将键名作为第一个参数,值作为第二个参数。
为了下一个活动能查询extra数据,你的意图extra应该使用公共常量作为键名。所以在MainActivity
类的顶部添加EXTRA_MESSAGE
的
定义:
public class MainActivity extends Activity {
public final static String EXTRA_MESSAGE = "com.example.myfirstapp.MESSAGE";
...
}
使用你应用的包名的前缀来命名意图的键名,通常是一个很好的做法。这确保它们是唯一的,如果你的应用程序还要与其他应用程序交互的话。
启动的第二个活动
要启动一个活动,调用startActivity
()方法
,向它传递你的意图。系统接收这个调用,并启动意图中 所指定的活动的一个实例。
加上这些新的代码,“发送”按钮调用的
完整的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
类了。
创建第二个活动
图1:Eclipse中的新建活动的向导。
要使用Eclipse创建一个新的活动:
1. 在工具栏上点击新建 。
2. 在出现的窗口中,打开Android的文件夹,并选择Android活动。单击“ 下一步“。
3. 选择BlankActivity,并单击“ 下一步“。
4. 填写在活动的详细信息:
o 项目:MyFirstApp
o 活动名称:DisplayMessageActivity
o 布局名称:activity_display_message
o 标题:My Message
o 谱系父com.example.myfirstapp.MainActivity的
o 导航类型:无
单击“ 完成“。
如果你使用不同的IDE或命令行工具,在项目的src/
目录创建一个新的文件名 为 DisplayMessageActivity.java
,在原来的MainActivity.java
文件旁边。
打开的DisplayMessageActivity.java
文件。如果你使用Eclipse来创建这个活动:
· 类已经包含了一个必需的onCreate() 方法的实现。
· 还有一个onCreateOptionsMenu()方法的实现,但在这个应用程序你不需要它,所以你可以删除它。
· 还有一个onOptionsItemSelected()方法的实现,它处理实施操作栏(action bar)中的向上的行为。请保留它原来的样子。
ActionBar的 API是因为仅适用于 HONEYCOMB(API级别11)和较高的平台,您必须在getActionBar()方法周围添加一个条件来检查当前的平台版本。此外,您必须为onCreate()方法添加@SuppressLint
(
“NewApi”
)
标签 ,避免线头(lint)错误。
DisplayMessageActivity
类现在看起来应该是这样的:
publicclass DisplayMessageActivityextends 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);
}
}
如果您使用Eclipse以外的IDE, 用上面的代码更新您的DisplayMessageActivity
类。
活动的所有子类都必须实现onCreate()
方法。当创建一个新的活动实例时,系统会调用这个方法。在这个方法中,你必须通过setContentView()方法定义活动的布局,并为你的活动组件进行初始设置。
注:如果您使用的是Eclipse以外的IDE,你的项目不包含setContentView()需要的activity_display_message
布局 。那也是可以的,因为你稍后将更新此方法,并将不使用该布局。
添加标题字符串
如果你使用Eclipse,你可以跳到下一章节,因为模板为新的活动提供了标题字符串。
如果您使用的是Eclipse以外的IDE,在strings.xml
文件中为新的活动添加标题:
<resources>
...
<string name="title_activity_display_message">My Message</string>
</resources>
将它添加到清单(manifest)
所有的活动都必须使用 <activity>
元素在清单文件AndroidManifest.xml
中
声明。
当你使用Eclipse工具创建活动时,它创建了一个默认项。如果你使用不同的IDE,你需要自己添加清单条目。它应该看起来像这样:
<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>
android:parentActivityName 属性声明此活动在应用程序的逻辑层次的父活动的名称。该系统使用此值来实现默认的导航行为,如在Android4.1(API级别16)和更高的向上导航。通过使用支持库并添加如上所示的<meta-data>
元素,您也可以为旧版本的Android提供相同的导航行为 。
注意:你的Android SDK中应该已经包含了最新的Android支持库。它是ADT束附带的,但如果你使用不同的IDE,你应该在 添加的平台和软件包步骤中已经安装过。在Eclipse中使用模板时,支持库会自动添加到您的应用程序项目(你可以在AndroidDependencies下看到库的JAR文件列表)。如果你不使用Eclipse,你需要按照建立支持库指南手动将库添加到您的项目,然后再回到这里。
如果你正在使用Eclipse开发,可以运行现在的应用程序,但没有什么发生。点击“发送”按钮,启动第二个活动,但它使用模板所提供的一个默认“Hello world”的布局。你很快就会更新活动来显示一个自定义的文本视图,所以如果你使用不同的IDE,应用程序尚未编译也不要担心。
接收意图
每一个活动都是由一个意图调用,不管用户是怎么导航到那里。你可以通过getIntent()
方法得到调用您的活动的意图和它包含的数据。
在DisplayMessageActivity
类onCreate() 方法,得到意图并提取提交到MainActivity
的
消息:
Intent intent= getIntent();
String message = intent.getStringExtra(MainActivity.EXTRA_MESSAGE);
显示信息
在屏幕上显示信息,创建一个TextView部件和使用setText()方法设置文本。然后把TextView传到setContentView()将它作为动布局的根视图 。
完整的onCreate()方法DisplayMessageActivity
现在看起来像这样:
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
// Get themessage from the intent
Intent intent = getIntent();
String message = intent.getStringExtra(MainActivity.EXTRA_MESSAGE);
// Create thetext view
TextView textView = new TextView(this);
textView.setTextSize(40);
textView.setText(message);
// Set thetext view as the activity layout
setContentView(textView);
}
现在,您可以运行应用程序。当它打开时,在文本字段中键入信息,点击发送,然后信息会出现在第二个活动中。
图2。最终的应用程序里的两个活动,运行环境Android 4.0。
就这样,你已经建立了你的第一个Android应用程序!
要了解更多关于构建Android应用程序,继续跟随我们的基本训练课程。下一课是管理活动的生命周期。