在完成上节课后,你有了能够显示包含一个文字输入框和一个按钮的activity(一个屏幕)的应用。在这节课中,你将在“MainActivity”类中添加一些代码,使得在用户点击“Send”按钮时,启动另一个新的activity。(译者注:activity可能能够翻译成“活动”,可是由于是安卓开发的专业术语,就不翻译了。)。html
要响应此按钮的“on-click”事件(event),打开“fragment_main.xml”布局文件,而后在“<Button>”节点内添加“android:onClick”属性。
java
<Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/button_send" android:onClick="sendMessage" />
“android:onClick”属性的值,“sendMessage”,是当用户点击按钮时系统将会调用的你的activity中的一个方法(method)。
android
打开“MainActivity”类(在项目中的“src/”目录下),而后添加相应的方法:编程
/** Called when the user clicks the Send button */ public void sendMessage(View view) { // Do something in response to button }
为了是系统能够匹配此方法和“android:onClick”所指定的方法名,方法签名(signature)必须如上所示。更明确的说,此方法必须:
app
下一步,你将读取文字输入项中的内容,而且发送读取的文本到另外一个activity。
布局
“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,调用“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”类。
在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”布局文件。由于你随后会更新此方法清且不会使用此布局,因此这不会成为问题。
若是你使用Eclipse,你能够直接跳到下一章节,由于建立activity模板为新的activity提供了标题字符串。
若是你使用Eclipse以外的IDE,在“strings.xml”文件中添加新activity的标题:
<resources> ... <string name="title_activity_display_message">My Message</string> </resources>
全部的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,不要担忧这个应用还不能被编译经过。
每一个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”。
< 上一课 | 课程介绍 | 下一课 > |