当您更改 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 中定义。别担心,如果这个解释是
对你不满意。我将在本节中更深入地介绍细节
关于属性和样式。
你也可以看看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.
我正在创建自己的 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 中定义。别担心,如果这个解释是 对你不满意。我将在本节中更深入地介绍细节 关于属性和样式。
你也可以看看this问题
如
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
anddefStyleRes
- The base values in this theme.