《Android编程权威指南》-读书笔记(八)
-activity之间的交互
本章,将为GeoQuiz应用增加第二个activity。Activity控制着当前屏幕界面,新增加的activity将增加第二个用户界面。
目标:
-
从一个activity中启动另一个activity。
-
在父activity(启动方)与子activity(被启动方)间进行数据传递。
Activity的设计流程
-
设计界面
-
添加字符串资源
-
创建布局文件
-
创建activity子类
-
调用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