【问题标题】:which constructor to be called for view?哪个构造函数被调用来查看?
【发布时间】:2011-11-13 18:18:22
【问题描述】:

我的自定义视图从 View 扩展而来。有 3 个视图构造函数:

  1. View(Context context, AttributeSet attrs, int defStyle)
  2. View(Context context, AttributeSet attrs)
  3. View(Context context)

从我的活动中,我打电话给std.setContentView(R.layout.main)。在我看来,第二个构造函数正在被调用。为什么是第二个?如何提前知道会调用哪一个以及为什么?

【问题讨论】:

    标签: android android-layout


    【解决方案1】:

    来自 Android 开发者网站的 View 文档:

    public View (Context context)

    从代码创建视图时使用的简单构造函数。

    因此,您可以使用此构造函数在 Java 中创建视图。当你从 XML 膨胀时它不会被调用。

    public View (Context context, AttributeSet attrs)

    从 XML 扩展视图时调用的构造函数。这在从 XML 文件构建视图时调用,提供在 XML 文件中指定的属性。此版本使用默认样式 0,因此应用的唯一属性值是 Context 的 Theme 和给定 AttributeSet 中的属性值。

    onFinishInflate() 方法将在所有子元素添加完毕后调用。

    所以当你没有指定样式时,当你从 XML 膨胀视图时,这个构造函数将被调用。

    public View (Context context, AttributeSet attrs, int defStyle)

    从 XML 执行膨胀并应用特定于类的基本样式。这个 View 的构造函数允许子类在膨胀时使用它们自己的基本样式。例如,Button 类的构造函数将调用此版本的超类构造函数并为 defStyle 提供 R.attr.buttonStyle;这允许主题的按钮样式修改所有基本视图属性(特别是其背景)以及 Button 类的属性。

    您应该实现所有这些构造函数,但您可以通过分别调用前两个的this(context, null)this(context, attrs, 0) 将所有工作放在第三个中。

    【讨论】:

    • super(context, attrs) 和 super(context, attrs, 0) 对我来说是不同的。第一个没问题,但第二个从视图中删除了原始样式,所以我不能使用这个(context,attrs,0)。这是新版本 Android 中的错误吗?
    • 请不要级联构造函数调用,请参阅下面的答案。
    • 我想这是 Jin 的回答:stackoverflow.com/a/34301725/326874
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-07
    相关资源
    最近更新 更多