笔记,Android获取Style属性值

方式一,通过AttributeSet 获取自定义的属性

 public MyView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init(attrs, 0);
    }
    private void init(AttributeSet attrs, int defStyle) {
        //首先判断attrs是否为null
        if(attrs != null){
            //获取AttributeSet中所有的XML属性的数量
            int count = attrs.getAttributeCount();
            //遍历AttributeSet中的XML属性
            for(int i = 0; i < count; i++){
                //获取attr的资源ID
                int attrResId = attrs.getAttributeNameResource(i);
                switch (attrResId){
                    case R.attr.customText:
                        //customText属性
                        mCustomText = attrs.getAttributeValue(i);
                        break;
                    case R.attr.customColor:
                        //customColor属性
                        //如果读取不到对应的颜色值,那么就用黑色作为默认颜色
                        mCustomColor = attrs.getAttributeIntValue(i, 0xFF000000);
                        break;
                }
            }
        }
    }

注意:xml配置只有两参的构造函数执行

方式二,使用系统主题的obtainStyledAttributes获取自定义的属性

private void init(AttributeSet attributeSet, int defStyle) {
        //首先判断attributeSet是否为null
        if(attributeSet != null){
            //获取当前MyView所在的Activity的theme
            Resources.Theme theme = getContext().getTheme();
            //通过theme的obtainStyledAttributes方法获取TypedArray对象
            TypedArray typedArray = theme.obtainStyledAttributes(attributeSet, R.styleable.MyView, 0, 0);
            //获取typedArray的长度
            int count = typedArray.getIndexCount();
            //通过for循环遍历typedArray
            for(int i = 0; i < count; i++){
                //通过typedArray的getIndex方法获取指向R.styleable中对应的属性ID
                int styledAttr = typedArray.getIndex(i);
                switch (styledAttr){
                    case R.styleable.MyView_customText:
                        //如果是R.styleable.MyView_customText,表示属性是customText
                        //通过typedArray的getString方法获取字符串值
                        mCustomText = typedArray.getString(i);
                        break;
                    case R.styleable.MyView_customColor:
                        //如果是R.styleable.MyView_customColor,表示属性是customColor
                        //通过typedArray的getColor方法获取整数类型的颜色值
                        mCustomColor = typedArray.getColor(i, 0xFF000000);
                        break;
                }
            }
            //在使用完typedArray之后,要调用recycle方法回收资源
            typedArray.recycle();
        }
    }

方式三,declare-styleable的方式获取自定义属性

自定义属性

        
        
        
        
    
配置
**
   	TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.FrameLayoutWithHole);
        mBackgroundColor = ta.getColor(R.styleable.FrameLayoutWithHole_background_color, -1);
        mRadius = ta.getFloat(R.styleable.FrameLayoutWithHole_hole_radius, 0);
        mRx = ta.getFloat(R.styleable.FrameLayoutWithHole_radius_x, 0);
        mRy = ta.getFloat(R.styleable.FrameLayoutWithHole_radius_y, 0);
        init(null, 0);
        ta.recycle();

方式四,获取系统主题的属性

 int[] systemeThemeAttr = new int[]{R.attr.colorPrimary,R.attr.listPreferredItemPaddingStart};
        TypedArray systemeThemeArray= getTheme().obtainStyledAttributes(systemeThemeAttr);
        Log.i("liangD","colorPrimary="+systemeThemeArray.getColor(0,100));
        Log.i("liangD","listPreferredItemPaddingStart="+systemeThemeArray.getDimension(1,100));
        systemeThemeArray.recycle();

方式五,通过代码获取自定义style中的值

  
  

	

 int[] attr = new int[]{R.attr.textSize,R.attr.textString};
 TypedArray array = this.obtainStyledAttributes(R.style.TextAppearanceLargeArr, attr);

  int textSize = array.getDimensionPixelSize(0  , -1);
  String textString=array.getString(1);

注意:这种方式只能每次获取最多两个属性的值,具体原因不详

你可能感兴趣的:(Android,View)