• 2011-04-03

    [Code] Android备忘5 - 关于StateList - [Code]

    版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
    http://www.blogbus.com/sgzxy-logs/114090959.html

    1、往res/drawable或color文件夹添加东西后(比如一个定义ColorStateList或StateListDrawable的xml),记得把工程rebuild,否则容易出现id被添加但文件本身却未被编译的奇怪问题(会出现FileNotFoundException)。

    2、StateListDrawable的mutate方法有bug,其源代码(1.6)如下:

        @Override
        public Drawable mutate() {
            if (!mMutated && super.mutate() == this) {
                final int[][] sets = mStateListState.mStateSets;
                final int count = sets.length;
                mStateListState.mStateSets = new int[count][];
                for (int i = 0; i < count; i++) {
                    mStateListState.mStateSets[i] = sets[i].clone();
                }
                mMutated = true;
            }
            return this;
        }

        可见mStateListState.mStateSets[i] = sets[i].clone();这句并未考虑sets[i]为null的情况。而大部分时候,你只会声明某些常用状态(比如state_pressed),未声明的状态皆为null,因此该mutate方法会出错。

    3、如何自定义CheckBox

        StateList中的state_checked这个状态是如何被一个View使用上的?带着这个问题粗略看了下CompoundButton的源码后,发现这涉及到对view的internal state机制的完整理解。目前先把这个理解放到一边,单纯讨论下我希望对自己的View在StateList定义中用上这个state_check该如何做:

        方法一:继承CompoundButton这个抽象类,于是你就得到了一个具备state_checked这一状态的自定义View了。

        方法二:直接使用CheckBox这个类。CheckBox的源码说明,其仅仅是一个CompoundButton+一个CheckBox的Style定义:

      name="Widget.CompoundButton.CheckBox">
       
    <item name="android:background">@android:drawable/btn_check_label_backgrounditem>
       
    <item name="android:button">@android:drawable/btn_checkitem>

        因此你使用时用自己定义的style替换之,或者直接把background和button属性给修改掉,就能不受内置style的影响了。

     

    4. 关于在父子控件之间传递State状态的两个方法:

    父获得子State:setAddStatesFromChildren

    子获得父State:setDuplicateParentStateEnabled

    如果这两个同时被设置了,那么你将得到异常。

     

    5. XML中用的那些常量到底被android放在哪?

    放在android.R.attrs里,于是放弃XML吧,一律用code定义之。

    分享到: