为什么我们需要第四个构造函数的棒棒糖?

我开始了一个针对Android Lollipop(21)的项目,并创build了一个自定义视图。 当我为视图生成构造函数时,我得到了一个新的第四个构造函数,它比其他的要多。

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); } } 

我的问题是,为什么我们需要它? 如果我移除这个构造函数并在棒棒糖上运行应用程序会发生什么?

Solutions Collecting From Web of "为什么我们需要第四个构造函数的棒棒糖?"

来自官方文档的信息

public View(上下文上下文,AttributeSet attrs,int defStyleAttr,int defStyleRes)

在API级别21中添加

从XML执行通货膨胀并从主题属性或样式资源应用特定于类的基本样式。 View的构造函数允许子类在膨胀时使用它们自己的基础样式。

当确定一个特定属性的最终值时,有四个input发挥作用:

  1. 给定AttributeSet中的任何属性值。
  2. 在AttributeSet(名为“style”)中指定的样式资源。
  3. 由defStyleAttr指定的默认样式。
  4. 由defStyleRes指定的默认样式。
  5. 这个主题的基础值。

这些input中的每一个都按顺序考虑,列出的第一个input优先于下面的input。 换句话说,如果在你提供的AttributeSet中,那么button的文本将始终是黑色的,而不pipe在任何样式中指定了什么。

参数

  • 上下文视图正在运行的上下文,通过它可以访问当前的主题,资源等。
  • attrs使视图膨胀的XML标签的属性。
  • defStyleAttr当前主题中的一个属性,其中包含对为视图提供默认值的样式资源的引用。 可以是0来不寻找默认值。
  • defStyleRes为视图提供默认值的样式资源的资源标识符,仅当defStyleAttr为0或在主题中找不到时使用。 可以是0来不寻找默认值。