(一)第1章:Android开发初体验
1.android:text属性
P11页
TextView与Button组件具有android: text属性。该属性指定组件要显示的文字内容。
请注意,android:text属性值不是字符串值,而是对字符串资源( stringresource )的引用。字符串资源包含在一个独立的名叫strings的XML文件中( strings.xml ),虽然可以硬编码设置组件的文本属性值,如android:text= “True”,但这通常不是个好主意。比较好的做法是:将文字内容放置在独立的字符串资源XML文件中,然后引用它们。这样会方便应用的本地化(支持多国语言)。
2.AppCompatActivity
P13页
AppCompatActivity它实际就是一个Activity子类,能为Android旧版本系统提供兼容支持.
3.资源与资源ID
P13-14页
在项目切换至Project视图。Project视图会显示出当前项目的所有文件和目录。
展开目录app/build/generated/sourcelr/debug.找到项目包名称并打开其中的R.java文件,即可看到当前应用当前所有的资源。R.java文件在Android项目编译过程中自动生成,如该文件头部的警示所述,请不要修改该文件的内容。
修改布局或字符串等资源后,R.java文件不会实时刷新。as另外还存有一份代码编译用的R. java隐藏文件。当前代码编辑区打开的R.java文件仅在应用安装至设备或模拟器前产生,因此只有在Android Studio中点击运行应用时,它才会得到更新。
R.java文件通常比较大,比如书中GeoQuiz应用,目前只有1个界面,3个按钮,R.java文件加上注释,就是1万多行代码.
我们看一下R.java文件的注解部分
/* AUTO-GENERATED FILE. DO NOT MODIFY.
*
* This class was automatically generated by the
* aapt tool from the resource data it found. It
* should not be modified by hand.
*/
根据翻译: 自动生成的文件.不能更改.
这个类是通过aapt工具自动生成的资源数据.它不应该被手动修改.
4.设置监听器
P17页
Android应用属于典型的事件驱动类型.不像命令行或脚本程序,事件驱动型应用启动后,即开始等待行为事件的发生,如用户点击某个按钮.(事件也可以由操作系统或其他应用触发,但用户触发的事件更直观,如点击按钮.)
应用等待某个特定事件的发生,也可以说应用正在”监听”特定事件.为响应某个事件而创建的对象叫做监听器(listener).监听器会实现特定事件的监听器接口(listener interface).
(二)第2章:Android与MVC设计模式
P44页
ImageButton有android:contentDescription 属性.该属性能为视力障碍用户提供方便.在为其设置文字属性值后,如果设备的可访问行选项作了相应设置,那么用户点击图形按钮时,设备便会读出属性值的内容.
(三)第3章:activity的生命周期
1.之前关于生命周期写过一篇博客. 点击跳转
2.设备配置与备选资源
P52-53页
旋转设备会改变设备配置.设备配置实际是一系列特征组合,用来描述设备当前状态.这些特征有: 屏幕方向、屏幕像素密度、屏幕尺寸、键盘类型、底座模式以及语言等.
通常,为匹配不同的设备配置,应用会提供不同的备选资源.为适用不同分辨率的屏幕,向项目添加多套同一个命名(并放在不同文件夹下)的图标就是这样一个使用案例.
设备的屏幕像素密度是个固定的设备配置,无法在运行时发生改变.然而,屏幕方向等特征可以在应用运行时改变.
在运行时配置变更发生时,可能会有更适合的资源来匹配新的设备配置.于是,Android销毁当前activity,为新配置寻找最近资源,然后创建新实例使用这些资源.
…..
设备处于水平方向时,Android会找到并使用res/layout-land目录下的布局资源.其他情况下,它会默认使用res/layout 目录下的布局资源.
3.保存数据以应对设备旋转
P56-58页
先重写onSaveInstanceState(Bundle)方法.
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt(KEY_INDEX, mCurrentIndex);
}
通过重写onSaveInstanceState(Bundle)方法,将一些数据保存在bundle中.
然后在onCreate(Bundle)方法中取出这些数据:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_quiz);
if (savedInstanceState != null) {
mCurrentIndex = savedInstanceState.getInt(KEY_INDEX, 0);
}
}
….
注意,在Bundle中存储和恢复的数据类型只能是基本类型以及可以实现Serializable或Parcelable接口的对象.在Bundle中保存定制类对象不是个好主意,因为你取出的对象可能已经没用了.比较好的做法是,通过其他方式保存定制类对象,而在Bundle中保存标识对象的基本类型数据.
(四)第4章:Android应用的调试
1.使用Android Lint
P70-71页
Android Lint是Android应用代码的静态分析器( staticanalyzer)。作为-一个特殊程序,它能在不运行代码的情况下检查代码错误。凭着对Android框架的熟练掌握,AndroidLint能深人检查代码,找出编译器无法发现的问题。在大多数情况下,AndroidLint检查出的问题都值得重视。
….
假如想主动查看项目中的所有潜在问题,可以选择Analyze→Inspect Code..菜单项手动运行Lint。在被问及检查项目的哪部分时,选择Whole project。 Android Studio会 立即运行Lint和其他一些静态分析器开始分析代码。
检查完毕,所有的潜在问题会按类别列出。展开Android Lint类别,可看到具体的Lint信息,如下图所示:
继续展开还可以看到更加详细的信息,包括问题发生的地方.
(五)第5章:创建第二个activity
1.TextView的tools属性的使用
P77页
<TextView
android:id="@+id/answer_text_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="24dp"
tools:text="Answer"
/>
注意用于显示答案的TextView组建,它的tools和tools:text属性的命名空间比较特别.改命名空间可以覆盖某个组建的任何属性.这样,就可以在as预览中看到效果.TextView有text属性.可以为它提供初始值,因而在应用运行前就知道它大概的样子.而在应用运行时,Answer文字不会显示出来.