2014-12-28 37 views
9

我开始了一个针对Android Lollipop(21)的项目,并创建了一个自定义视图。当我为视图生成构造函数时,我得到了一个新的第四个构造函数,它比其他构造函数更多的参数。为什么我们需要第四个构造函数用于棒棒糖?

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

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

+0

看到https://stackoverflow.com/questions/9195713/do-i-need-all-three-constructors-for-an-android-custom-view –

+0

你不需要它并没有什么将会发生,如果你删除它(见前面的评论)。它存在于默认视图中,以便您可以传入默认样式资源(请参阅下面的answer re:docs)。 – alanv

+0

为什么有人想这样做? – mbonnin

回答

2

信息从official doc

公共视图(上下文的背景下,AttributeSet中的ATTRS,INT defStyleAttr, INT defStyleRes)

在API级别21

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

当确定特定属性的最终值,存在 四个输入即来发挥作用:

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

这些输入中的每一个都按顺序考虑,其中第一个列出的 优先于以下列出的输入。换句话说,如果在 属性集中你已经提供了,那么 这个按钮的文本将始终是黑色的,而不管在任何样式中指定的是 。

参数

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