在完成上节课后,你有了可以显示包含一个文字输入框和一个按钮的activity(一个屏幕)的应用。在这节课中,你将在“MainActivity”类中添加一些代码,使得在用户点击“Send”按钮时,启动另外一个新的activity。(译者注:activity可能可以翻译成“活动”,但是因为是安卓开发的专业术语,就不翻译了。)。
响应“Send”按钮
要响应此按钮的“on-click”事件(event),打开“fragment_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中的一个方法(method)。
打开“MainActivity”类(在项目中的“src/”目录下),然后添加相应的方法:
/** Called when the user clicks the Send button */
public void sendMessage(View view) {
// Do something in response to button
}
为了是系统可以匹配此方法和“android:onClick”所指定的方法名,方法签名(signature)必须如上所示。更明确的说,此方法必须:
下一步,你将读取文字输入项中的内容,并且发送读取的文本到另一个activity。
创建一个“Intent”(意图)
“Intent”(意图)是提供运行时绑定不同构件(比如,两个activities)的对象。“Intent”表述一个应用“意图去做某件事”。你可以用“Intent”实现各种各样的任务,但是最经常的是用来启动另一个activity。
在“sendMessage()”方法内部,创建一个启动名为“DisplayMessageActivity”的activity的“Intent”:
Intent intent = new Intent(this, DisplayMessageActivity.class);
这需要你导入(import)“Intent”类:
import android.content.Intent;
提示:在Eclipse中,同时按下“Ctrl + Shift + O”可以自动导入缺失的类(在Mac中是“Cmd + Shift +O”)。
此处用到的构造函数(constructor)需要两个参数(parameters):
第一个参数为一个“Context”类型的对象(这里使用了“this”对象,因为“Activity”类是“Context”类的子类)
以及需要系统将此“Intent”递送的到的应用构件(component)的类(Class)(此例中为要启动的activity的类)
注意:如果你在使用Eclipse或者其他的集成开发环境,引用“DisplayMessageActivity”到导致一个错误提示,因为这个类还不存在。目前,先忽略这个错误;你将很快建立此类。
一个“Intent”不仅能够让你启动一个“activity”,他同时还可以携带数据集(bundle)到另一个“activity”。在“sendMessage()”方法内,使用“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);
注意:现在,你需要导入“android.widget.EditText”类。你很快会定义“EXTRA_MESSAGE”常量。
一个“Intent”可以通过一组叫做“extras”(额外数据)的键值对(key-value pairs)来携带多种类型的数据。“putExtra()”方法接收第一个参数作为键值,第二个参数为对应的数据值。
为了使其他的activity可以查询这些额外数据(extra data),你应该使用一个公有常量(public constant)来定义此intent的键值。因此,在“MainActivity”类的最开始,添加“EXTRA_MESSAGE”的定义:
public class MainActivity extends ActionBarActivity {
public final static String EXTRA_MESSAGE = "com.example.myfirstapp.MESSAGE";
...
}
一般来说,使用你的应用的包名称作为intent额外数据(extra)的键值前缀是一个好的习惯做法。如果你的应用要和其他应用交互,这样可以保证他们是唯一的。
给其他应用发送intent
我们此节课创建的intent叫做“显式intent”(explicit intent),因为这个“Intent”指定了需要发送到的应用构件(app component)。同时,intend也可以是“隐式”的(implicit),此类“Intent”不会指定一个确定的构件(component),但是允许安装在当前设备上的任何应用响应此intent,只要它们可以满足在“Intent”的不同参数中指定的各种元数据规范(meta-data specification)。更多的信息,请参阅课程“Interacting with Other Apps”。
启动第二个Activity
要启动一个activity,调用“startActivity()”方法并且传入你的“Intent”作为参数。系统接收到这个调用后,会启动一个在此“Intent”中指定的“Activity”的实例(instance)。
随着新的代码加入,完整的“sendMessage()”方法如下,此方法将被“Send”按钮调用:
/** 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:
点击工具栏上的“New”。
在所显示的窗口中,打开“Android”目录,然后选择“Android Activity”。点击“Next”。
选择“BlankActivity”然后点击“Next”。
填入activity的详细信息:
Project(项目):MyFirstApp
Activity Name(activity名称):DisplayMessageActivity
Layout Name(布局名称):activity_display_message
Fragment Layout Name(“碎片”名称:译者注:“碎片”是Android的新特性,以后将会介绍):fragment_display_message
Title(标题):My Message
Hierarchial Parent(层次关系中的父构件):com.example.myfirstapp.MainActivity
Navigation Type(导航类型):None
点击“Finish”。
图示1:Eclipse中的新建activity向导
如果你在使用其他的IDE或者命令行工具,在项目的“src/”目录中,创建一个名为“DisplayMessageActivity.java”的文件,使之与已存在的“MainActivity.java”在一起。
打开“DisplayMessageActivity.java”文件。如果你是使用Eclipse创建的:
这个类已经包含了一个“onCreate()”方法的实现。你随后将更新这个方法的实现。
其中还有一个“onCreateOptionsMenu()”方法的实现,但是在此应用中,你不需要它。所以你可以删除它。
其中还有一个“onOptionsItemSelected()”方法的实现,此方法处理操作栏(action bar)中的“向上”(Up)行为。保留原样。
其中还有一个继承自“Fragment”的“PlaceholderFragment”类。在此activity的最终版本中,你不需要这个类。
“Fragments”(碎片,这个也是Android的专用名词,以后将不翻译)可以将应用的功能和用户界面(UI)分解为可重用的模块。需要“fragment”的更多信息,请参阅“Fragments API Guide”。此activity的最终版本将不使用fragment。
现在的“DisplayMessageActivity”类应该如下:
public class DisplayMessageActivity extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_display_message);
if (savedInstanceState == null) {
getSupportFragmentManager().beginTransaction()
.add(R.id.container, new PlaceholderFragment()).commit();
}
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
/**
* A placeholder fragment containing a simple view.
*/
public static class PlaceholderFragment extends Fragment {
public PlaceholderFragment() { }
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_display_message,
container, false);
return rootView;
}
}
}
如果你使用Eclipse之外的其他IDE,使用上述代码更新“DisplayMessageActivity”类。
所有“Activity”的子类必须实现“onCreate()”方法。当系统创建一个此activity的新实例的时候,将调用此方法。这个方法就是你使用“setContentView()”方法定义activity布局和为activity的各个构件(components)初始化设置(initial setup)的地方。
注意:如果你使用Eclipse之外的IDE,你的项目没有“setContentView()”所需的“activity_display_message”布局文件。因为你随后会更新此方法清且不会使用此布局,所以这不会成为问题。
添加标题字符串(string)
如果你使用Eclipse,你可以直接跳到下一章节,因为创建activity模板为新的activity提供了标题字符串。
如果你使用Eclipse之外的IDE,在“strings.xml”文件中添加新activity的标题:
<resources>
...
<string name="title_activity_display_message">My Message</string>
</resources>
添加到清单文件(manifest)
所有的activity必须使用“<activity>”元素在“AndroidManifest.xml”文件中声明。(译者注:manifest在Java以及Android编程中都是常用的术语,此类文件一般是用来对资源和代码进行说明和描述。)
如果你使用Eclipse创建此activity,它会创建一个缺省项。如果你使用其他IDE,你需要自己添加此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>
“android:parentActivityName”属性声明此activity在应用的逻辑继承关系上的父activity。系统通过这个值来实现缺省的导航行为,比如在Android 4.1(API level 16)以及更新版本中的“向上导航”(Up navigation)。你可以使用“Support Library”(兼容支持类库,译者注:这个类库提供了让旧版本的Android支持新的功能的一系列帮助类和方法)并且添加如上所示的“<meta-data>”元素的方法在旧版Android中提供同样的导航行为。
注意:你的Adroid SDK应该已经包含了最新版本的Adroid Support Library。它包含在ADT捆版软件包中,但是如果你使用其他IDE,你应该已经在“Adding Platforms and Packages”这个步骤安装了它。当使用Eclipse的模板时,“Support Library”会自动被添加到你的项目中(你可以在“Android Dependencies”列表中看到此类库的jar文件)。如果你不使用Eclipse,你需要手动添加此类库到你的项目中——跟随“setting up the Support Library”向导去做,然后返回这里。
如果你使用Eclipse开发,你现在可以运行这个应用,但不会有什么特别的发生。点击“Send”按钮,可以启动第二个activity,但是这个activity使用创建模板中提供的缺省“Hello World”布局。你将很快更新这个activity使用一个自定义的文本视图组件(text view)来取而代之,所以,如果你使用其他IDE,不要担心这个应用还不能被编译通过。
接收Intent
每个Activity都是被一个Intent所调用的,不管用户是如何被导航到那里的。你可以调用“getIntent()”方法来获得启动你的activity的Intent,然后获取包含于之中的数据。
在“DisplayMessageActivity”类的“onCreate()”方法中,获取这个intent并且读取“MainActivity”发送的消息。
Intent intent = getIntent();
String message = intent.getStringExtra(MainActivity.EXTRA_MESSAGE);
显示消息
要在屏幕上显示这则消息,需要创建一个“TextView”部件(widget)然后通过“setText()”方法设置它的显示文字。因此,通过“setContentView()”方法,将“TextView”添加到布局中作为activity的根视图元素。
完整的“DisplayMessageActivity”的“onCreate()”方法如下:
@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);
}
你在你可以运行应用了。当它开启,在文本输入项中键入一条消息,点击“Send”按钮,之后,这条消息将显示在第二个activity中。
图示2:在Android 4.4中,完成版应用中的两个activity。
如是,你已经完成了你的第一个Android应用(app)!
想学习更多,请跟随链接到下一课程。
此文章整体或部分翻译自Android Open Source Project的文档。依照Creative Commons 2.5 Attribution License使用并分享。此文章(译文,中文)原始链接为“[安卓教学] 创建你的第一个安卓应用 - 第四课 - 启动另外一个activity”。原文(英文)链接为“Starting Another Activity”。
< 上一课 | 课程介绍 | 下一课 > |
来源:oschina
链接:https://my.oschina.net/u/1471474/blog/210507