启动另外一个Activity

在完成了上一节课的学习后,我们已经创建了一个带有text输入框和一个button的app。

在本课中,我们将在MainActivity类中添加SendButton的单击响应代码以启动另外一个Activity。

响应Send Button

为了响应Send Button的单击事件,我们打开Activity_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",是MainActivity的一个方法名,并且当用户

单击Send Button的时候会调用该方法。

打开类MainActivity(在项目src目录下),然后在该类中添加Send Button的响应方法:sendMessage。

/** Called when the user clicks the Send button */
public void sendMessage(View view) {
// Do something in response to button
}

如果使用的是Eclipse等类似的编辑器的话,在参数View的地方会提示错误的,为了不出现错误,需要先导入View类。

import android.view.View;

小提示:在Eclipse下可以使用快捷键Ctrl+Shift+O组合键自动导入需要导入的类。(Mac系统下快捷组合键是:Cmd+Shift+O)

为了系统能够将该方法和android:onClick事件绑定到一起,该方法需要设置如下标志位(修饰符?):

1.该方法需要为Public类型

2.返回值类型需要为void

3.View作为唯一的参数(标识哪个view的单击事件)

建立一个Intent

Intent是一个对象,它能够将两个分离的组件(比如两个Activities)进行运行时绑定。

Intent可以理解为当前app “想要做什么”。你可以为多任务使用Intent,但是大多数情况下

我们常常是用Intent来启动另外一个Activity。

现在我们在sendMessage()方法内创建一个Intent来启动另外一个叫DisplayMessageActivity的Activity。

Intent intent = new Intent(this, DisplayMessageActivity.class);

Intent函数初始化构造函数需要两个参数:

1.第一个参数是一个设备上下文Context(这里使用this的原因是因为Activity类是Context类的子类)

2.第二个参数是Intent需要启动的Activity。

注意:当我们在Eclipse以及其类似的IDE下编写此代码时,使用DisplayMessageActivity时会触发一个错误。

现在先忽略这个错误提示,因为我们还没有创建Activity DisplayMessageActivity,我们会在稍后创建它。

创建的Intent不仅仅能够启动一个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可以附加各种数据类型的集合使用STL中我们熟知的键-值的方式,我们称它为额外的(extras)。

附加方法就是使用putExtra()方法,它的第一个参数就是键值,第二个参数就是该键对应的值。

为了指定的Activity能够获取Intent附加的值,我们需要使用一个public类型的常量来作为附加值的键值。

所以我们定义在MainActivity类的顶部创建EXTRA_MESSAGE常量:

public class MainActivity extends Activity {
public final static String EXTRA_MESSAGE = "com.example.myfirstapp.MESSAGE";
...
}

为了区分不同的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类的步骤如下:

1.点击新建图标。

2.选择Android文件夹下的Android Activity,然后单击下一步。

3.选择BlankActivity,然后单击下一步。

4.填写新类的具体参数:

  11. Project: MyFirstApp  ->也就是我们当前的app

  22. Activity Name: DisplayMessageActivity ->也就是我们将要创建的类的名称

  33. Layout Name: activity_display_message  -> 布局xml文件名称

  44. Title: My Message  -> 新Activity标题名称

  55. Navigation Type: none

  

5.点击完成按钮。

如果你使用的不是Eclipse或者是命令行工具,在项目src目录下于MainActivity.java文件相邻位置创建一个DisplayMessageActivity.java文件。

如果使用的是Eclipse创建的Activity,那么我们打开DisplayMessagActivity.java文件。

1.新建的类已经帮我们创建好了onCreate()方法。

2.还有一个创建好的哦你CreateOption是Menu()方法,不过这个例子不需要它,所以可以删除掉。

3.还有一个创建好的哦你Option是ItemSelected()方法,这个方法用来处理单击ActionBar上的上一步操作按钮的点击事件。保留该方法。

因为ActionBar的API只在HONEYCOMB(API level 11)以及其以后的版本才能使用。所以我们必须在使用getActionBar()方法前进行条件判断

以判断当前的平台是否支持此API。另外我们必须在onCreate()方法内使用@SuppressLint("NewApi")标签来避免lint错误。(注:新版本的Android SDK

已经不需要这令不处理了,它自己创建好了一个setupActionBar()方法来进行检查操作。)

现在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);
}
}

如果你是用的不是Eclipse的集成开发环境,使用上面的代码更新你的DisplayMessageActivity类。

所有Activity的子类都必须重载onCreate()方法。当创建该类的实例的时候,系统会调用该函数。

在这个函数内部你必须使用setContentView()方法来定义Activity的布局。

注意:如果你使用的不是Eclipse,你的setContentView()所需要的activity_display_message布局文件

并没有自动创建,不用担心,稍后在我们使用到该布局的时候就会添加它。

添加标题字符串

<resources>
...
<string name="title_activity_display_message">My Message</string>
</resources>

添加新类到mainfest文件

所有的Activities都需要在mainfest文件中进行声明,可以使用<activity>元素(标签)进行声明。

同理Eclipse会自动为我们创建该元素,所以如果你使用的不是Eclipse,那么就需要在mainfest文件中添加

如下内容:

<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属性标识了该类的父类的类名称。系统使用此值去实现默认的操作。

比如安卓4.1以及其以后版本的后退操作。我们也可以使用这种行为在老版本中通过SupportLibrary

以及添加<meta-data>元素。

如果使用的是Eclipse那么我们就可以运行这个APP了,但是不会实现什么大功能,当我们点击这个按钮的

时候,只是显示"Hello world",而这个字符串就是我们第一课所看到由模板自动生成的。

接收Intent

每一个被Intent调用的Activity,无论用户是如何操作抵达这一步的,我们都可以通过调用getIntent()方法

来得到Intent以及其中附加的数据包。

下面来看一下在DisplayMessageAcitvity类的onCrate()方法中来得到intent并且获取MainActivity中附加的数据包。

Intent intent = getIntent();
String message = intent.getStringExtra(MainActivity.EXTRA_MESSAGE);

显示附加的数据包

为了显示数据到屏幕上,我们将创建一个TextView窗口并且使用setText()方法将获取到的数据包赋予此Textview。

然后使用setContentView()方法将此TextView设置到DisplayMessageAcitvity的显示视窗中。

DisplayMessageAcitvity完整的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了,我们输入一些字符串在MainActivity的EditText中,然后单击send button,

那么我们输入的字符串就会在intent调用的DisplayMessageAcitvity中显示出来了。

如果你使用的Eclipse,你可以跳过下一段落,因为Eclipse的模板已经提供了新建类的标题字符串

如果你使用的不是Eclipse,添加标题字符串在strings.xml文件中:

android-启动另外一个Activity的更多相关文章

  1. Android -- 启动另外一个Activity的方式(2s自动启动)

    1.  使用Handler  并且可以设置进入和退出的动画效果 Class < ? > activityClass; Class [ ] paramTypes = { Integer.TY ...

  2. Android应用开发学习之启动另外一个Activity

    作者:刘昊昱 博客:http://blog.csdn.net/liuhaoyutz 一个Activity可以启动另外一个Activity,以实现比较复杂的功能,我们来看一个例子,其运行效果如下图所示: ...

  3. 【Android Developers Training】 4. 启动另一个Activity

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  4. Android世界第一个activity启动过程

    Android世界第一个activity启动过程 第一次使用Markdown,感觉不错. Android系统从按下开机键一直到launcher的出现,是一个如何的过程,中间都做出了什么操作呢.带着这些 ...

  5. Android官方教程翻译(4)——启动另一个Activity

    Starting Another Activity 启动另一个Activity PREVIOUSNEXT THIS LESSON TEACHES YOU TO 这节课教你 1.   Respond t ...

  6. Android中点击按钮启动另一个Activity以及Activity之间传值

    场景 点击第一个Activity中的按钮,启动第二个Activity,关闭第二个Activity,返回到第一个Activity. 在第一个Activity中给第二个Activity传递值,第二个Act ...

  7. 如何启动另一个Activity

    --------siwuxie95 首先为res->layout下my_layout.xml 的Design添加一个Button,进入Text, android:text 修改为:启动另一个Ac ...

  8. 【安卓面试题】在一个Activity启动另一个Activity和在Service中启动一个Activity有什么区别

    在Activity中可以直接使用Intent启动另一个Activity 显式Intent intent = new Intent(context, activity.class) 隐式 Intent ...

  9. 4) 十分钟学会android--建立第一个APP,启动另一个Activity

    在完成上一课(建立简单的用户界面)后,我们已经拥有了显示一个activity(一个界面)的app(应用),该activity包含了一个文本字段和一个按钮.在这节课中,我们将添加一些新的代码到MyAct ...

  10. Android 只开启一个Activity实例

    在一个Activity中,多次调用startActivity()来启动另一个Activity,要想只生成一个Activity实例,方法有两种. 方法一:设置起动模式 一个Activity有四种启动模式 ...

随机推荐

  1. idea从零搭建简单的springboot+Mybatis

    需用到的sql /* Navicat MySQL Data Transfer Source Server : localhost root Source Server Version : 80012 ...

  2. (转)使用Apache的ab工具进行压力测试

    转:http://www.cnblogs.com/luckyliu/archive/2012/03/04/2379306.html Apache附带的ab工具(本机使用的PHP环境是WAMP集成环境, ...

  3. Apache负载均衡

    Apache负载均衡 Apache也是可以实现负载均衡的.Apache的负载均衡主要是通过mod_proxy_balancer实现的.那么,apache负载均衡的配置方法是什么样的? 在apache的 ...

  4. 前端开发者进阶之ECMAScript新特性--Object.create

    前端开发者进阶之ECMAScript新特性[一]--Object.create   Object.create(prototype, descriptors) :创建一个具有指定原型且可选择性地包含指 ...

  5. 2.2_springboot2.x消息RabbitMQ整合&amqpAdmin管理组件的使用

    5.1.1.基本测试 1.引 spring-boot-starter-amqp** <dependencies> <dependency> <groupId>org ...

  6. LeetCode 67. Add Binary【个位补0,不必对齐】【easy】

    Given two binary strings, return their sum (also a binary string). The input strings are both non-em ...

  7. Error resolving template,template might not exist or might not be accessible by any of the configured Template Resolvers

    template might not exist or might not be accessible by any of the configured Template Resolvers at o ...

  8. 请求参数MD5加密---函数助手

  9. iOS开发系列-UIImageView的contentMode

    typedef NS_ENUM(NSInteger, UIViewContentMode) { UIViewContentModeScaleToFill, UIViewContentModeScale ...

  10. Mysql优化-索引

    1. 索引的本质 MySQL官方对索引的定义为:索引是帮助MySQL高效获取数据的数据结构. 数据库查询是数据库的最主要功能之一.我们都希望查询数据的速度尽可能的快,因此 数据库系统的设计者会从查询算 ...