res/的子目录
-animator/ 保存property animations类型的xml,使用R.animator引用
-anim/保存tween animations,也可以保存property animations,不过为了区分还是分开保存比较好。使用R.anim引用
-color/保存颜色的state lists,即根据view的不同状态而改变的颜色,通过R.color引用
-drawable/保存png、.9、jpg、gif或者xml格式的drawable,也就是可以保存frame animations
-mipmap/保存不同分辨率的启动图标
-layout/布局
-menu/菜单
-raw/存放以原始格式保存的文件,会生成资源id,比如R.raw.fileName,使用Resources.openRawResources()获取InputStream。如果需要使用原始文件名和文件目录来访问,就存放在与res同级的assets目录下,不会生成资源id,使用AssetManager来读取。
-values/
-xml/可以通过Resources.getXml方法读取的xml
资源类型:
1. 动画:property animations和view animations(tween animation和frame animation)
-property animation:
<set
android:ordering=["together" | "sequentially"]>
<objectAnimator
android:propertyName="string"
android:duration="int"
android:valueFrom="float | int | color"
android:valueTo="float | int | color"
android:startOffset="int"
android:repeatCount="int"
android:repeatMode=["repeat" | "reverse"]
android:valueType=["intType" | "floatType"]/>
<animator
android:duration="int"
android:valueFrom="float | int | color"
android:valueTo="float | int | color"
android:startOffset="int"
android:repeatCount="int"
android:repeatMode=["repeat" | "reverse"]
android:valueType=["intType" | "floatType"]/>
<set>
...
</set>
</set>
- tween animation:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@[package:]anim/interpolator_resource"
android:shareInterpolator=["true" | "false"] >
<alpha
android:fromAlpha="float"
android:toAlpha="float" />
<scale
android:fromXScale="float"
android:toXScale="float"
android:fromYScale="float"
android:toYScale="float"
android:pivotX="float"
android:pivotY="float" />
<translate
android:fromXDelta="float"
android:toXDelta="float"
android:fromYDelta="float"
android:toYDelta="float" />
<rotate
android:fromDegrees="float"
android:toDegrees="float"
android:pivotX="float"
android:pivotY="float" />
<set>
...
</set>
</set>
- frame animation:
<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot=["true" | "false"] >
<item
android:drawable="@[package:]drawable/drawable_resource_name"
android:duration="integer" />
</animation-list>
2.state list color
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true"
android:color="#ffff0000"/> <!-- pressed -->
<item android:state_focused="true"
android:color="#ff0000ff"/> <!-- focused -->
<item android:color="#ff000000"/> <!-- default -->
</selector>
3.
提供多种可选资源:通过在不同修饰符的同种目录下存放同名文件来实现,注意多种修饰符必须根据文档中指定的顺序排列才能被正确识别。目录名不区分大小写,系统会自动转为小写。
创建别名资源:如果多个不同修饰符的目录需要用到同一个资源,可以通过创建别名资源的方式达到只保存一个资源,多个共用的效果。如果是drawable,可以创建
<?xml version="1.0" encoding="utf-8"?>
<resources>
<drawable name="icon">@drawable/icon_ca</drawable>
</resources>
如果要共用layout,则可以
<?xml version="1.0" encoding="utf-8"?>
<merge>
<include layout="@layout/main_ltr"/>
</merge>
字符串:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="hello">Hello</string>
<string name="hi">@string/hello</string>
</resources>
颜色等等
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="red>#f00</color>
<color name="highlight">@color/red</color>
</resources>
引用风格属性:也就是引用当前所应用主题的某个属性值。引用方式:
?[<package_name>:][<resource_type>/]<resource_name>
比如android:textColor="?android:textColorSecondary"
因为系统会自动识别,所以不用使用?android:attr/textColorSecondary
中的attr前缀
为什么配置发生改变时要销毁重建Activity?为了要配合配置改变调用对应的资源类型,但是可能会导致状态丢失,或者保存各种状态比较麻烦。
两种方法可以避免这种默认操作:
1. 在Activity中添加Fragment,Fragment的onCreate中调用setRetainInstace(true),Activity重建时使用FragmentManager取回Fragment。
public class RetainedFragment extends Fragment {
// data object we want to retain
private MyDataObject data;
// this method is only called once for this fragment
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// retain this fragment
setRetainInstance(true);
}
public void setData(MyDataObject data) {
this.data = data;
}
public MyDataObject getData() {
return data;
}
}
public class MyActivity extends Activity {
private static final String TAG_RETAINED_FRAGMENT = "RetainedFragment";
private RetainedFragment mRetainedFragment;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// find the retained fragment on activity restarts
FragmentManager fm = getFragmentManager();
mRetainedFragment = (RetainedFragment) fm.findFragmentByTag(TAG_RETAINED_FRAGMENT);
// create the fragment and data the first time
if (mRetainedFragment == null) {
// add the fragment
mRetainedFragment = new RetainedFragment();
fm.beginTransaction().add(mRetainedFragment, TAG_RETAINED_FRAGMENT).commit();
// load data from a data source or perform any calculation
mRetainedFragment.setData(loadMyData());
}
// the data is available in mRetainedFragment.getData() even after
// subsequent configuration change restarts.
...
}
}
然后可以通过判断Acitivty是否不需要Fragment来移除fragment
@Override
public void onPause() {
// perform other onPause related actions
...
// this means that this activity will not be recreated now, user is leaving it
// or the activity is otherwise finishing
if(isFinishing()) {
FragmentManager fm = getFragmentManager();
// we will not need this fragment anymore, this may also be a good place to signal
// to the retained fragment object to perform its own cleanup.
fm.beginTransaction().remove(mDataFragment).commit();
}
}
注意:此时不能在Fragment中保存绑定了Activity的资源,比如Drawable、Adapter、View等使用了context实例的资源,这样会导致Activity的所有资源都无法被回收,产生内存泄漏。
第二种方法就是在Activity的标签中声明android:configChanges=”orientation|keyboardHidden”,这样系统不会自动重新创建Activity,而是会调用onConfigurationChanged方法。3.2开始,屏幕旋转也会导致screeSize条件的改变。如果不需要随着配置改变更新UI,可以直接不实现onConfigurationChanged方法,还是会使用原先的资源,只是避免了Activity的重启。