API Guides之App Resources

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的重启。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值