Android attr 属性介绍

attr属性的定义/读取/出错/使用

  • 1.1 自定义attr属性与读取

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    /**
    * 初始化。
    *
    * @param context 上下文。
    * @param attributeSet 属性。
    */
    private void initialize(Context context, AttributeSet attributeSet) {
    mPaint.setAntiAlias(true);
    TypedArray typedArray = context.obtainStyledAttributes(attributeSet, R.styleable.CircleProgressbar);
    if (typedArray.hasValue(R.styleable.CircleProgressbar_circle_color)){
    inCircleColors = typedArray.getColorStateList(R.styleable.CircleProgressbar_circle_color);
    } else{
    inCircleColors = ColorStateList.valueOf(Color.TRANSPARENT);
    }
    circleColor = inCircleColors.getColorForState(getDrawableState(), Color.TRANSPARENT);
    typedArray.recycle();
    }
  • 1.2在res/values 文件下定义一个attrs.xml 文件

    1
    2
    3
    4
    5
    6
    7
    <?xml version="1.0" encoding="utf-8"?> 
    <resources>
    <declare-styleable name="View名称">
    <attr name="textColor" format="color"/>
    <attr name="textSize" format="dimension"/>
    </declare-styleable>
    </resources>
    • format有以下几种类型及读取
    • image
  • 1.3如果在attr中不同View引用相同属性名字时出现错误的解决方法

    • 问题代码【引用代码(两个都引用了textColor会出错)】

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      <?xml version="1.0" encoding="utf-8"?> 
      <resources>
      <declare-styleable name="View名称">
      <attr name="textColor" format="color"/>
      <attr name="textSize" format="dimension"/>
      </declare-styleable>
      <declare-styleable name="View2名称">
      <attr name="textColor" format="color"/>
      <attr name="hint" format="reference" />
      </declare-styleable>
      </resources>
    • 错误报告提示:

      1
      2
      Error:Execution failed for task ':包路径:mergeReleaseResources'.
      > 本地包路径\src\main\res\values\attrs.xml: Error: Found item Attr/textColor more than one time
    • 解决方式:

      • 第一种方式,更改名称,不要出现相同的name

        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        <?xml version="1.0" encoding="utf-8"?>
        <resources>
        <declare-styleable name="View名称">
        <attr name="textColor" format="color"/>
        <attr name="textSize" format="dimension"/>
        </declare-styleable>
        <declare-styleable name="View2名称">
        <attr name="inTextColor" format="color"/>
        <attr name="hint" format="reference" />
        </declare-styleable>
        </resources>
        • 第二种方式,抽取相同属性

          1
          2
          3
          4
          5
          6
          7
          8
          9
          10
          11
          12
          <?xml version="1.0" encoding="utf-8"?> 
          <resources>
          <attr name="textColor" format="color"/>
          <declare-styleable name="View名称">
          <attr name="textColor"/>
          <attr name="textSize" format="dimension"/>
          </declare-styleable>
          <declare-styleable name="View2名称">
          <attr name="textColor"/>
          <attr name="hint" format="reference" />
          </declare-styleable>
          </resources>
  • 1.4 enum/flag的特殊之处

    • 下面就列举flag(enum也类似),先看代码:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      <declare-styleable name = "View名称">
      <attr name="inputType">
      <flag name = "text" value = "0" />
      <flag name = "number" value = "1" />
      <flag name = "textPassword" value = "2" />
      <flag name = "numberPassword" value = "3" />
      <flag name = "numberDecimal" value = "4" />
      </attr>
      </declare-styleable>
    • 这里是我在自定义一个EditText的时候,为了设置输入内容的类型

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      setInputType(attrs.getInt(R.styleable.View名称_inputType, 0));

      public void setInputType(int type) {
      switch (type) {
      case 0:
      mEditText.setInputType(InputType.TYPE_CLASS_TEXT);
      break;
      case 1:
      mEditText.setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_VARIATION_NORMAL);
      break;
      case 2:
      mEditText.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
      break;
      case 3:
      mEditText.setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_VARIATION_PASSWORD);
      break;
      case 4:
      mEditText.setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_DECIMAL);
      break;
      }
      }