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

kom*_*tFX 21 android android-layout

我从我的自定义视图扩展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).第二个构造函数在我的视图中被调用.为什么第二个?如何预先知道哪一个将被调用以及为什么?

Cra*_*igy 45

来自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)前两个构建函数将所有工作放在第三个构造函数中.

  • super(context,attrs)和super(context,attrs,0)对我来说差异化.第一个是好的,但第二个从视图中删除原始样式,所以我不能使用它(context,attrs,0).这是Android的新版本中的错误吗? (2认同)
  • 请不要级联构造函数调用,请参阅下面我的答案。 (2认同)