当您更改 xml 文件中的属性时,调用自定义视图的哪个构造函数?

When you change attributes in an xml file, which constructor of custom view is called?

我正在创建自己的 custom view

这是 MyCustomView.java

的代码
    package com.krish.customviews
    import...
    
    public class MyCustomView extends FrameLayout{
          public MyCustomView(@NonNull Context context){
               super(context);
               init();

          }
          public MyCustomView(@NonNull Context context, @Nullable AttributeSet attrs){
               super(context, attrs);
               init();

          }
          public MyCustomView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr){
               super(context, attrs, defStyleAttr);
               init();

          }
          private void init(){
          }
            
    }

还有我的 main_layout.xml 文件:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

<com.krish.MyCustomView> 

//layout attributes


/>

我的问题是:如果我在 .xml 文件中更改自定义视图的属性,是否会调用 MyCustomView.java 文件的第二个或第三个构造函数?

当您从 XML 访问自定义视图时,只需要双参数构造函数。

View(Context context, AttributeSet attrs)

3 和 4 个参数的构造函数旨在由 super 类 调用以通过主题属性和直接默认样式资源提供默认样式。

View(Context context, AttributeSet attrs, int defStyleAttr)
View(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes)
  • defStyleAttr参数是对样式属性的引用 在主题中定义。
  • defStyleRes参数是对默认样式的引用 在 styles.xml 中定义。别担心,如果这个解释是 对你不满意。我将在本节中更深入地介绍细节 关于属性和样式。

Source back to this article

你也可以看看this问题

所述,当 布局从 XML[=48= 膨胀时调用 双参数 构造函数].

  • defStyleAttr为默认样式。它不直接指向样式,而是让您指向主题中定义的 属性 之一。
    如果您正在对小部件进行子类化并且未指定 您自己的 默认样式,那么请务必在构造函数中使用父级 类 默认样式(不要只传递 0).可以 0 仅不查找默认值。
    例如在 MaterialButton 中:R.attr.materialButtonStyle

  • defStyleRes 是为视图提供默认值的样式资源的资源标识符,仅在 defStyleAttr 为 0 或在主题中找不到时使用.可以 0 不查找默认值。
    例如在 MaterialButton 中:R.style.Widget_MaterialComponents_Button

AttributeSet 参数基本上可以被认为是您在布局中指定的 XML 参数的映射。
Keep in mind the styling precedence order:

When determining the final value of a particular attribute, there are four inputs that come into play:

  • Any attribute values in the given AttributeSet.
  • The style resource specified in the AttributeSet (named "style").
  • The default style specified by defStyleAttr and defStyleRes
  • The base values in this theme.