为什么我们需要Lollipop的第4个构造函数?

时间:2014-12-28 08:10:12

标签: java android view android-5.0-lollipop

我开始了一个针对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上运行应用程序会发生什么?

1 个答案:

答案 0 :(得分:3)

来自official doc

的信息
  

public View(Context context,AttributeSet attrs,int defStyleAttr,   int defStyleRes)

     

在API级别21中添加

     

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

     

确定特定属性的最终值时,有   发挥作用的四个输入:

     
      
  1. 给定AttributeSet中的任何属性值。
  2.   
  3. AttributeSet中指定的样式资源(名为“style”)。
  4.   
  5. defStyleAttr指定的默认样式。
  6.   
  7. defStyleRes指定的默认样式。
  8.   
  9. 此主题中的基本值。
  10.         

    这些输入中的每一个都按顺序考虑,首先列出   优先于以下几个。换句话说,如果在   然后是你提供的AttributeSet   按钮的文本将始终为黑色,无论是什么   在任何样式中指定。

         

    参数

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