fragment的保留
fragment的retainInstance属性值默认为false,可以通过setRetainInstance(boolean)去修改,该值为true则表示fragment将会被保留。已保留的fragment不会随activity一起被销毁,会一直保留并在需要的时候传递给新的activity,其中的全部变量实例(如button、textview等)也将保持不变。
被保留的fragment的实质
被保留的fragment,实际上是fragment实例没有被销毁,随着activity销毁的是它的视图。当新的activity创建后,新的FragmentManager会指向被保留的fragment,并重新创建视图。
图片来源于《Android编程权威指南》
fragment必须同时满足两个条件才能进入保留状态:
1.已调用fragment的setRetainInstance(true);
2.因设备配置改变(通常为设备旋转),托管activity正在被销毁。
保留fragment与onSaveInstanceState(Bundle)的比较
两者的区别主要在与:数据保存时间。
被保留的fragment虽然不会随着activity的销毁而销毁(如设备旋转),不过如果activity是因为OS需要回收内存而被销毁的话,被保留的fragment也会被销毁。
onSaveInstanceState()数据保留时间则是维持在整个Activity生命周期。
因此,如果在设备旋转的时候,点击home键使得Activity处于后台(onStop()),此时,OS回收内存,销毁了Activity,被保留的fragment随之销毁,而新建的Activity则能够调用onSaveInstanceState()保留的数据。
本地化资源
本地化是一个基于设备语言设置,为应用提供合适资源的过程。
本地化过程:
1.创建带有目标语言配置修饰符的资源子目录;
2.将可选资源放入1的子目录中。
语言配置修饰符来自于ISO 639-1标准代码,如中文的修饰符为-zh,英文为-en。
默认资源
当Android无法找到匹配设备配置的资源时,会使用默认资源。所以默认资源的最大作用是保证应用的正常运行。
使用dpi、分辨率等修饰符的稍有区别,找不到匹配配置的资源时,先根据自有的规则找相近的资源文件,若一直找不到,最后才使用默认资源。
配置修饰符
配置修饰符优先级表
Android会基于上图所示顺序确定修饰符的使用优先级。
多重配置修饰符
在同一资源目录上使用多个配置修饰符,各配置修饰符必须按照优先级顺序排列。如values-zh-land是一个有效的资源目录名,而values-land-zh则是无效的。
资源匹配
1.排除不兼容的目录
如values-zh-land和values-zh在屏幕方向为竖直时,前者不兼容,后者兼容,使用后者的资源;
2.按优先级表筛选
在1.的基础上,按照优先级表进行筛选,如values-zh-land和values-zh在屏幕方向为水平时,两者都兼容,同样有语言修饰符,那么再看屏幕方向,后者被排除,前者被使用。
注意:屏幕显示密度并不适用于上述规则,Android会选择其认为最合适的资源来匹配设备配置,这些资源可能不对应设备配置修饰符目录下准备的资源。
资源使用原则
资源命名
1.资源名只能是小写且不能包含空格;
2.引用不应包含文件拓展名。
资源目录结构
1.所有资源都必须保存在res/目录的子目录下;
2.res子目录的名字与Android编译过程绑定,无法随意更改,规定的有drawable/、layouot/、raw/、values/等;
3.Android会无视res/目录下的其它子目录,如res/my_stuff/,Android不会使用里面放置的资源;
4.无法在res/目录下创建多级子目录。