本课教会教你
完成了上一节课的内容,你已经拥有了一个app,它可以显示一个activity (单个屏幕),里面有文本编辑区和一个按键。 在本课中,你将会在MainActivity
中添加一些代码,使得用户点击Send按钮时启动一个新的activity。
响应Send按键
为了响应按键的点击事件,打开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属性的值一致,而且,按键处理函数必须满足以下条件:
接下来,你将会填充这个函数来读取文本编辑区的内容,并且将它发送到另外一个activity。
构建一个Intent
一个 Intent
就是一个对象,提供在运行时绑定分开的组件的服务(例如两个activity)。 这个Intent
代表一个app “意图做某事” 。你可以使用intent来实现各种任务,但通常情况下它被用于启动另外一个 activity。
在sendMessage()
方法里面,创建一个 Intent
来启动一个activity,叫做DisplayMessageActivity
:
- Intent intent = new Intent(this, DisplayMessageActivity.class);
截图如下所示:
这里的构造函数使用了两个参数:
发送一个intent到其他apps
本课中所创建的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
为了启动一个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类。
创建第二个Activity
在Eclipse中创建一个新的activity:
- 点击工具栏中的 New 。
- 在弹出的窗体中,打开Android 目录并且选择Android Activity。点击Next。
- 选择BlankActivity然后点击Next.
- 填写activity的详细信息:
- Project: MyFirstApp
- Activity Name: DisplayMessageActivity
- Layout Name: activity_display_message
- Title: My Message
- Hierarchial Parent: com.example.myfirstapp.MainActivity
- Navigation Type: None
点击 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编译不过。
接收Intent
每个 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的生命周期。
今天的文章activity启动另一个activity_课程开发的四个步骤分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/48109.html