要为视图调用哪个构造函数?

时间:2011-11-13 18:18:22

标签: android android-layout

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

  1. View(Context context, AttributeSet attrs, int defStyle)
  2. View(Context context, AttributeSet attrs)
  3. View(Context context)
  4. 从我的活动中,我致电std.setContentView(R.layout.main)。第二个构造函数在我的视图中被调用。为什么第二个?如何提前知道将调用哪一个以及为什么?

1 个答案:

答案 0 :(得分:43)

来自Android开发者网站的View:

文档

public View (Context context)

  

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

因此,您可以使用此构造函数在Java中创建View。从XML扩充时不会调用它。

public View (Context context, AttributeSet attrs)

  

从XML扩展视图时调用的构造方法。当从XML文件构造视图时,会调用此方法,从而提供XML文件中指定的属性。此版本使用默认样式0,因此应用的唯一属性值是Context主题和给定AttributeSet中的属性值。

     

在添加完所有子项后,将调用onFinishInflate()方法。

因此,当您未指定样式时,在从XML扩展View时将调用此构造函数。

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

  

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

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