我开始了一个针对Android Lollipop(21)的项目,并创建了一个自定义视图。当我为视图生成构造函数时,我得到了一个新的第4个构造函数,它比其他构造函数占用更多的参数。
public class FooView extends FrameLayout {
public FooView(Context context) {
super(context);
}
public FooView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public FooView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
// This 4th constructor
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public FooView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
}
}
我的问题是,为什么我们需要它?如果我删除这个构造函数并在Lollipop上运行应用程序会发生什么?
答案 0 :(得分:3)
public View(Context context,AttributeSet attrs,int defStyleAttr, int defStyleRes)
在API级别21中添加
从XML执行通胀并应用特定于类的基本样式 主题属性或样式资源。 View的这个构造函数允许 子类在膨胀时使用自己的基本样式。
确定特定属性的最终值时,有 发挥作用的四个输入:
- 给定AttributeSet中的任何属性值。
- AttributeSet中指定的样式资源(名为“style”)。
- defStyleAttr指定的默认样式。
- defStyleRes指定的默认样式。
- 此主题中的基本值。
醇>这些输入中的每一个都按顺序考虑,首先列出 优先于以下几个。换句话说,如果在 然后是你提供的AttributeSet 按钮的文本将始终为黑色,无论是什么 在任何样式中指定。
参数
- context运行视图的上下文,通过它可以访问当前主题,资源等。
- attrs膨胀视图的XML标记的属性。
- defStyleAttr当前主题中的一个属性,它包含对为其提供默认值的样式资源的引用 视图。可以为0以查找默认值。
- defStyleRes为视图提供默认值的样式资源的资源标识符,仅在defStyleAttr为0或不能使用时才使用 在主题中找到。可以为0以查找默认值。