完成了上一节课的内容,你已经拥有了一个app,它可以显示一个activity (单个屏幕),里面有文本编辑区和一个按键。 在本课中,你将会在MainActivity
中添加一些代码,使得用户点击Send按钮时启动一个新的activity。
为了响应按键的点击事件,打开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) { // Do something in response to button }
这时要加载 View
类:
import android.view.View;
提示: 在Eclipse中, 按下Ctrl + Shift + O 可以加载缺少的类(Cmd + Shift + O on Mac)。
添加代码前截图:
添加代码后截图:
.java文件中的按键处理函数名必须和.xml文件中的onClick属性的值一致,而且,按键处理函数必须满足以下条件:
View
参数 (这就是将被点击的View
)接下来,你将会填充这个函数来读取文本编辑区的内容,并且将它发送到另外一个activity。
Intent
就是一个对象,提供在运行时绑定分开的组件的服务(例如两个activity)。 这个
Intent
代表一个app "意图做某事" 。你可以使用intent来实现各种任务,但通常情况下它被用于启动另外一个 activity。
在sendMessage()
方法里面,创建一个 Intent
来启动一个activity,叫做DisplayMessageActivity
:
Intent intent = new Intent(this, DisplayMessageActivity.class);
截图如下所示:
这里的构造函数使用了两个参数:
Context
作为第一参数(因为
Activity
类是Context
的一个子类)
系统将要递送Intent
到的app组件的类
(这时activity应该已经启动)本课中所创建的intentis被认为是明确的intent,因为 Intent
指定了明确的目标app组件。 然而,当Intent没有指定目标组件时,intents也可以是隐含的,只要满足元数据规则,设备上的所有app都会响应这个intent。要了解更多的信息,请看有关Interacting with Other Apps 的类。
注意: 在例IDE中引用DisplayMessageActivity将会出现错误,例如
Eclipse,因为这个还没有存在。现在先不管它,下面将会创建这个类。
一个intent不仅允许你启动另外一个activity,而且可以将大量信息携带给这个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.content.Intent和android.widget.EditText
的声明。 将会定义一个EXTRA_MESSAGE常量。
截图如下所示:
一个Intent
可以携带许多数据类型作为关键值对,叫做extras。 这个putExtra()
方法的第一参数是使用关键名字,第二个方法是其值。
为了使得下一个activity可以查询extra数据,你应该用一个公共常量来定义你的extra的key。所以在MainActivit
y类的顶部添加EXTRA_MESSAGE
的定义:
public classMainActivityextendsActivity{ publicfinalstaticString EXTRA_MESSAGE="com.example.myfirstapp.MESSAGE"; ... }
截图如下:
用你的app包的名字的前缀来为你的intent extras定义key是一个很好的习惯。这保证了当你的app和其它app交互时,它们是独一无二的。
为了启动一个activity, 调用 startActivity()
并且传递你的Intent
。系统接受这个调用并且启动一个Intent
定义的Activity
实例。
完整的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类。
在Eclipse中创建一个新的activity:
点击 Finish。
如果你使用其他的IDE或者命令行,在工程的src/
目录下紧跟着MainActivity.java
创建一个DisplayMessageActivity.java文件。
打开DisplayMessageActivity.java
文件。 如果你使用Eclipse来创建activity:
onCreate()
方法的一个实现。onCreateOptionsMenu()
方法的实现,但是这个app中并不需要,因此你可以将其删除。最后,它还包含了一个onOptionsItemSelected()
的实现,它用于处理action bar的Up行为。这个保持原装即可。由于 ActionBar
APIs 在HONEYCOMB
(API 等级 11)和更高的本版中才有效,因此你在getActionBar()
方法前必须添加一个条件,以检查当前的平台版本。另外,你必须在onCreate()
方法前添加@SuppressLint("NewApi")
标签来避免 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
类。
部分截图:——和上面的代码有点出入,这里新添加了一个setupActionBar()函数,然后在里面做版本检查;另外,在我的版本中,添加@SuppressLint("NewApi")将会导致编译不通过。因此最后我把它删了。
Activity
的所有子类都必须实现onCreate()
方法。当创建一个新的actiity实例时,系统就调用这个函数。 这个函数就是你必须使用setContentView()
定义activity布局的地方,也是你执行activity组件初始化的地方。
注意: 如果你使用其它的IDE,你的工程将没有setContentView()
所需的activity_display_message
布局。这没所谓的,因为你将会更新这个方法,而这个布局也用不上。
如果你使用Eclipse,你可以跳到下一小节,因为模版已经为新的activity提供了标题字符串。
如果你使用的是其他IDE,添加如下标题到strings.xml
文件中:
<resources> ... <string name="title_activity_display_message">My Message</string> </resources>
所有的activities必须在你的清单文件AndroidManifest.xml
中使用一个<activity>
元素来声明。
当你使用Eclipse工具来创建activity,它创建一个默认的入口。如果使用不同的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
属性声明了这个activity的父activity的名字。 系统使用这个值来实现默认的导航行为,例如Android 4.1 (API level 16)或者更高版本中的Up navigation 。你可以使用 Support Library 并且添加如上所示的 <meta-data>
元素来为一些旧版本的Android提供导航。
注意: 你的 Android SDK 应该已经包含了最新的Android支持库。 它已经包含在ADT绑定包里面,但是如果你使用其他IDE,你应该在Adding Platforms and Packages 中安装他它。当你使用Eclipse中的模版,支持库自动的添加到你的app工程中(你可以在Android的依赖关系中看到库的JAR文件)如下图所示。如你不使用Eclipse,你需要手动添加这个库到你的工程中—按照setting up the Support Library的向导。
如果你使用Eclipse进行开发,你现在可以运行你的app了。但是没有太多效果。点击Send按键启动第二个activity,但是它使用模版提供的默认的 "Hello world"布局。你将会更新这个activity来显示定制的内容,所以如果你使用不同的IDE也不要担心这个app编译不过。
每个 Activity
都被一个Intent
调用, 不管用户如何操作。你可以在启动activity的时候通过调用getIntent()
获得Intent
,然后查询里面的数据。
在DisplayMessageActivity
类的onCreate()
方法里面,,获取intent然后抽取出MainActivity传过来的信息
:
Intent intent = getIntent(); String message = intent.getStringExtra(MainActivity.EXTRA_MESSAGE);
为了在屏幕上现世信息,创建一个 TextView
窗体并且使用setText()
设置文本。 然后添加
TextView
,并且通过将其传递给setContentView()
使其作为当前activity布局的t根视图。
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); }
截图如下:
现在你可以运行这个app了。当它打开的时候,在本文编辑框中输入信息,然后点击发送,你就可以看到信息显示在第二个activity中。
就是他,你已经建立了你的一个Android app了!
想学习更多的Android app编程,请继续学习接下来的基础训练课程。下一个课程是管理Activity的生命周期。