《Android编程权威指南》-读书笔记(八) -activity之间的交互

《Android编程权威指南》-读书笔记(八)

-activity之间的交互

 

本章,将为GeoQuiz应用增加第二个activity。Activity控制着当前屏幕界面,新增加的activity将增加第二个用户界面。

 

目标:

  • 从一个activity中启动另一个activity。
  • 在父activity(启动方)与子activity(被启动方)间进行数据传递。

 

Activity的设计流程

  1. 设计界面
  2. 添加字符串资源
  3. 创建布局文件
  4. 创建activity子类
  5. 调用activity子类

 

设计界面

 

添加字符串

 

<string name="cheat_button">Cheat!</string>

<string name="warning_text">Are you sure you want to do this?</string>

<string name="show_answer_button">Show Answer</string>

<string name="judgment_toast">Cheating is wrong.</string>

 

 

 

 

 

创建布局文件

 

Res/layout 右键->New->Layout resource file

组件定义图如下:

预览图如下:

 

创建新的activity子类

在New操作里面是可以直接使用模板的

为了进一步了解activity,直接创建一个java文件。

在java->com.example.lijing.geoquiz上右键->New->Java Class

创建完后直接在public class CheatActivity后面加入 extends Activity然后回车,Android Studio会自动import android.app.Activity。

 

然后加入onCreate()

首先还是输入@Override。这一步操作会自动帮我们校验重写的方法是不是会正确。如果在库中没有这个方法,那么在编译的时候会报错。在Android Studio中会直接给出提示信息。

 

onCreate()的Bundle参数,在输入完Bundle后直接Alt+Enter导入Bundle的引用。Bundle的变量名称是可以随便写的,但是模板都是saveInstanceState那么我们就用这个。这个可以少很多不必要的麻烦。

 

在onCreate()中加入

super.onCreate(saveInstanceState);

setContentView(R.layout.activity_cheat);

 

至此,CheatActivity最简单的版本已经完成。代码如下:

http://git.oschina.net/canglin/GeoQuiz/commit/66331f8aa6899cb83566c20756ecb31d37e744a0

 

在manifest配置文件中申明activity

所有的activity都必须在manifest配置文件中申明,这样操作系统才能够使用它们。如果使用向导来生成activity的话,这一步是可以省掉的。为了熟悉操作,书中要求我们采用最简单的java文件来创建了一个最简单的activity。那么我们就必须在manifest中自己手动来申明这个activity。

<activity android:name=".CheatActivity" android:label="@string/app_name" />

 

在application节点下面再增加一个activity节点,事实上name属性会自动提示出来并要求填写完成。在增加一个lablel。因为我们有限完成了strings.xml所有的属性都会自动提醒,按Enter或者Tab都能自动完成。

 

代码如下:

http://git.oschina.net/canglin/GeoQuiz/commit/23bb430229b50343e5d6f099c2cf1cf2d5948763

 

调用activity子类

首先在横向纵向2个布局文件中添加2个按钮,并且调整好位置。

Layout-land/activity_quiz.xml 文件中的效果如下:

Layout/activity_quiz.xml 文件中的效果如下:

2个布局文件的代码分别如下:

http://git.oschina.net/canglin/GeoQuiz/commit/f1d5a444c00066cff9a9a69a2f42494c44d73859

 

调用一个activity实际上是操作系统直接调用的,在activity中使用startActivity()方法将调用请求发送给操作系统的ActivityManager。ActivityManager负责创建Activity实例并调用其onCreate()方法。

 

2个activity的代码如下:

http://git.oschina.net/canglin/GeoQuiz/commit/36bfa7933bcc07b9049c4fcfc4cce4fd42156cdc

 

这个CheatActivity的功能实际上是,从QuizActivity中传送这个问题的答案到子activity中,然后在子 activity中点击按钮来显示答案。

 

在代码中Extra数据的key为这个样子

public static final String EXTRA_ANSWER_IS_TRUE = "com.example.lijing.geoquiz.answer_is_true";

看起来特别的长,难道其他的应用中也可以调用Extra数据?

 

我们使用startActivity(Intent Extra)来打开一个子activity,并且传送一个Intent Extra数据。

在子类中我们通过getIntent().getBooleanExtra()来获取数据。

 

如何从子activity中取回数据

 

首先要用startActivityForResult()来打开一个要获取数据的activity。

然后重写onActivityResult()来接受数据。

最后使用setResult()来写入数据。

 

在这个程序中我们要获取一个从子activity中返回的值,这个值就是我们有没有点击界面中的作弊按钮,然后在根据返回的结果这边显示有没有作弊。

代码如下:

http://git.oschina.net/canglin/GeoQuiz/commit/b6d609dbb3bc9bb789527cb4ed1007a940f0fdd8

posted @ 2015-03-23 20:27  苍林  阅读(701)  评论(0编辑  收藏  举报