【问题标题】:Why do we need a 4th constructor for Lollipop?为什么我们需要 Lollipop 的第四个构造函数?
【发布时间】:2015-02-24 19:16:23
【问题描述】:

我开始了一个针对 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);
  }
}

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

【问题讨论】:

  • 你不需要它,如果你删除它也不会发生任何事情(参见前面的评论)。它存在于默认视图中,因此您可以传入默认样式资源(请参阅下面的答案:文档)。
  • 为什么会有人这样做?

标签: java android view android-5.0-lollipop


【解决方案1】:

来自official doc的信息

公共视图(上下文上下文,AttributeSet attrs,int defStyleAttr, int defStyleRes)

在 API 级别 21 中添加

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

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

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

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

参数

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

【讨论】:

    猜你喜欢
    • 2011-02-04
    • 1970-01-01
    • 2023-04-09
    • 2021-10-15
    • 2015-01-27
    • 1970-01-01
    • 2015-05-23
    • 1970-01-01
    • 2011-09-27
    相关资源
    最近更新 更多