Android 之 ?attr/

在代码中遇到了android:tint="?attr/iconColor", iconColor这个是什么引用,在哪定义赋值的,真是不明觉厉!后来发?attr 是和主题Theme有关。也就是说在Resource资源中定义,在主题Theme中赋值,使用的时候,该值会随着主题的变化而获取的值也是不同的


一、自定义属性att基本用法

(1)、定义

在values文件夹中创建一个attrs_base.xml,名称随意起。定义一个属性,并给出属性的格式。



    
    

(2)、赋值

在Theme中赋值,但是要在AndroidManifest.xml中使用该Theme才能生效,否则会报错


    
    
    
    // TextView中使用
    android:textAppearance="@style/TextStyle"
  • 小结 : 自定义的属性就是这样。使用系统定义好的?android:attr/ 或者 ?android:

二、Attr、Style、Theme属性优先级

布局xml中的属性text、Style中的属性text、自定义的构造参数defStyleAttr中的text属性和Theme中的定义的text属性,如果都定义使用了同一个属性,他们的优先级的如何?

(1)、 首先定义一个自定义View,SelfView



    
    
    


    

        
        
        
        

    


(2)、 自定义Style



    
    

    
    

    
    


    


(3)、 自定义SelfView

public class SelfView extends android.support.v7.widget.AppCompatTextView {

    public SelfView(Context context) {
        this(context,null);
    }

    public SelfView(Context context, @Nullable AttributeSet attrs) {
        this(context, attrs,R.attr.attr_defStyle); // 使用定义的属性
    }

    public SelfView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        TypedArray typedArray = context.obtainStyledAttributes(attrs,R.styleable.SelfView,defStyleAttr,0);
        String text1 = typedArray.getString(R.styleable.SelfView_text1);
        String text2 = typedArray.getString(R.styleable.SelfView_text2);
        String text3 = typedArray.getString(R.styleable.SelfView_text3);
        String text4 = typedArray.getString(R.styleable.SelfView_text4);
        typedArray.recycle();

        Log.e(getClass().getSimpleName(), "SelfView: " +text1 );
        Log.e(getClass().getSimpleName(), "SelfView: " +text2 );
        Log.e(getClass().getSimpleName(), "SelfView: " +text3 );
        Log.e(getClass().getSimpleName(), "SelfView: " +text4 );

    }
}

(4)、 使用

    

(5)、 输出

 SelfView: xml text1
 SelfView: text2 style_viewStyle
 SelfView: text3 style_attr_defStyleAttr
 SelfView: text4 theme

小结 :

  • 直接在xml中使用的优先
  • 在xml中 style="@style/style_viewStyle"次之
  • 自定义SelfView中使用的defStyleAttr再次之
  • 最后是Theme中的赋值的属性

GitHub代码:https://github.com/puhaojie/AndroidAttrDemo

三、自定义View中format

format 描述 例子
reference 某一个资源的引用 使用 :android:background = "@drawable/back"
color 颜色值
boolean 布尔值
dimension 尺寸大小 使用 : android:layout_width = "1dp"
float 浮点值
integer 整型
string 字符串
fraction 百分数 使用 : android:pivotX = "200%"
enum 枚举值
flag 按位或

你可能感兴趣的:(Android 之 ?attr/)