android-启动另外一个Activity
启动另外一个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的更多相关文章
- Android -- 启动另外一个Activity的方式(2s自动启动)
1. 使用Handler 并且可以设置进入和退出的动画效果 Class < ? > activityClass; Class [ ] paramTypes = { Integer.TY ...
- Android应用开发学习之启动另外一个Activity
作者:刘昊昱 博客:http://blog.csdn.net/liuhaoyutz 一个Activity可以启动另外一个Activity,以实现比较复杂的功能,我们来看一个例子,其运行效果如下图所示: ...
- 【Android Developers Training】 4. 启动另一个Activity
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- Android世界第一个activity启动过程
Android世界第一个activity启动过程 第一次使用Markdown,感觉不错. Android系统从按下开机键一直到launcher的出现,是一个如何的过程,中间都做出了什么操作呢.带着这些 ...
- Android官方教程翻译(4)——启动另一个Activity
Starting Another Activity 启动另一个Activity PREVIOUSNEXT THIS LESSON TEACHES YOU TO 这节课教你 1. Respond t ...
- Android中点击按钮启动另一个Activity以及Activity之间传值
场景 点击第一个Activity中的按钮,启动第二个Activity,关闭第二个Activity,返回到第一个Activity. 在第一个Activity中给第二个Activity传递值,第二个Act ...
- 如何启动另一个Activity
--------siwuxie95 首先为res->layout下my_layout.xml 的Design添加一个Button,进入Text, android:text 修改为:启动另一个Ac ...
- 【安卓面试题】在一个Activity启动另一个Activity和在Service中启动一个Activity有什么区别
在Activity中可以直接使用Intent启动另一个Activity 显式Intent intent = new Intent(context, activity.class) 隐式 Intent ...
- 4) 十分钟学会android--建立第一个APP,启动另一个Activity
在完成上一课(建立简单的用户界面)后,我们已经拥有了显示一个activity(一个界面)的app(应用),该activity包含了一个文本字段和一个按钮.在这节课中,我们将添加一些新的代码到MyAct ...
- Android 只开启一个Activity实例
在一个Activity中,多次调用startActivity()来启动另一个Activity,要想只生成一个Activity实例,方法有两种. 方法一:设置起动模式 一个Activity有四种启动模式 ...
随机推荐
- 2019年12月12日英语学习-Will I Or Won't I ?For Since
没办法,听不懂,记不住.就会一句.艹
- NX二次开发-设置功能区工具栏的可见性UF_UI_set_ribbon_vis
NX9+VS2012 1.打开D:\Program Files\Siemens\NX 9.0\UGII\menus\ug_main.men 找到装配和PMI,在中间加上一段 TOGGLE_BUTTON ...
- AtCoder ARC061E Snuke's Subway Trip 最短路
目录 Catalog Solution: (有任何问题欢迎留言或私聊 && 欢迎交流讨论哦 Catalog Problem:传送门 Portal 原题目描述在最下面. \(n(1 ...
- LeetCode 24. Swap Nodes in Pairs (两两交换链表中的节点)
题目标签:Linked List 题目给了我们一组 linked list,让我们把每对nodes 互换位置. 新键一个dummy node,然后遍历list,每次建立 s1 和 s2 记录两个点,然 ...
- Python正则表达式如何进行字符串替换实例
Python正则表达式如何进行字符串替换实例 Python正则表达式在使用中会经常应用到字符串替换的代码.有很多人都不知道如何解决这个问题,下面的代码就告诉你其实这个问题无比的简单,希望你有所收获. ...
- shell脚本实现取当前时间
shell 实现获取当前时间,并进行格式转换的方法: 1)原格式输出 2018年 09月 30日 星期日 15:55:15 CST time1=$(date) echo $time1 2)时间串输出 ...
- org.apache.hadoop.hbase.PleaseHoldException: Master is initializing
电脑换了重新装了下系统,在本机ubuntu 的环境下搭建hadoopCDH4.5 伪分布式.进入Hbase shell,在创建表的时候出现异常如下: ERROR: org.apache.hadoop. ...
- spark-sql性能优化之——多线程实现多Job并发执行
直接上代码 val spark = SparkSession.builder() .appName("name") .master("local[2]") .g ...
- 【POJ】1182 食物链
这是<挑战设计程序竞赛>中的例题. 题目链接:http://poj.org/problem?id=1182 题意:中文题面.不赘述. 题解: 代码: //带权并查集 #include< ...
- ASP.NET Core Web应用在发布时选择是否对视图进行编译
原文:ASP.NET Core Web应用在发布时选择是否对视图进行编译 在我们发布ASP.NET Core Web应用程序时,选择以文件形式发布,发布方法选择文件系统 默认情况下,会把Views的视 ...