膨胀 xml 与创建新实例
Inflating an xml vs. creating a new instance
这两个一样吗?
一个。
my_custom_view.xml
<?xml version="1.0" encoding="utf-8"?>
<com.abc.views.MyCustomView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
MyCustomView.java
public class MyCustomView extends LinearLayout {
public MyCustomView(Context context) {
super(context);
init();
}
public static MyCustomView inflate(ViewGroup parent) {
MyCustomView view = (MyCustomView) LayoutInflater.
from(parent.getContext()).inflate(R.layout.my_custom_view, parent, false);
return view;
}
B.
MyCustomView.java
public class MyCustomView extends LinearLayout {
public MyCustomView(Context context) {
super(context);
init();
}
public static MyCustomView inflate(ViewGroup parent) {
MyCustomView view = new MyCustomView(parent.getContext());
parent.addChild(view);
return view;
}
当我们运行,
MyCustomView.inflate(parent);
不完全是。长话短说,这里的区别在于实例 A,LayoutParams 的宽度将设置为 "MATCH_PARENT",高度将设置为 "WRAP_CONTENT"。在实例 B 中,LayoutParams 将是父视图应用的任何默认值(宽度和高度通常为 WRAP_CONTENT)。
此外,在实例 A 中,视图 未附加 到父视图。在实例 B 中,视图 已附加 到父视图。
长话短说,还有其他区别。
public static MyCustomView inflate(ViewGroup parent) {
MyCustomView view = (MyCustomView) LayoutInflater.
from(parent.getContext()).inflate(R.layout.my_custom_view, parent, false);
return view;
}
这有几件事:
- 膨胀视图,为其提供父级的布局参数。如果
parent 是一个 FrameLayout,那么 LayoutParams 实例将是一个
FrameLayout.LayoutParams
。如果是 LinearLayout,则
LayoutParams 将是 LinearLayout.LayoutParams
。布局
参数由 xml "layout_width" 和
"layout_height"。在这种特殊情况下,宽度设置为 MATCH_PARENT
,高度设置为 WRAP_CONTENT
(尽管这可以被父视图覆盖)。
- 视图未添加或附加到父视图,如下所示
false
参数。 (true
会将视图附加到父级)。
- 您最终应用于 XML 的任何其他属性都将应用于
查看。
- 将应用备用构造函数,因此不同
属性将被填充。调用哪个构造函数取决于您应用的属性。
View#(Context context, AttributeSet attrs)
View#(Context context, AttributeSet attrs, int defStyleAttr)
View#(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes)
另一方面:
public static MyCustomView inflate(ViewGroup parent) {
MyCustomView view = new MyCustomView(parent.getContext());
parent.addChild(view);
return view;
}
- 默认 LayoutParams 将应用于子视图。在大多数情况下,宽度和高度都设置为
WRAP_CONTENT
,但这取决于父视图。
- 视图已附加到父视图。如果调用者试图将其添加到另一个父视图,则会导致崩溃。
- 绝对没有附加属性应用于视图。必须手动添加它们。
- 创建时只使用了
View#(Context context)
构造函数。
这两个一样吗?
一个。
my_custom_view.xml
<?xml version="1.0" encoding="utf-8"?>
<com.abc.views.MyCustomView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
MyCustomView.java
public class MyCustomView extends LinearLayout {
public MyCustomView(Context context) {
super(context);
init();
}
public static MyCustomView inflate(ViewGroup parent) {
MyCustomView view = (MyCustomView) LayoutInflater.
from(parent.getContext()).inflate(R.layout.my_custom_view, parent, false);
return view;
}
B.
MyCustomView.java
public class MyCustomView extends LinearLayout {
public MyCustomView(Context context) {
super(context);
init();
}
public static MyCustomView inflate(ViewGroup parent) {
MyCustomView view = new MyCustomView(parent.getContext());
parent.addChild(view);
return view;
}
当我们运行,
MyCustomView.inflate(parent);
不完全是。长话短说,这里的区别在于实例 A,LayoutParams 的宽度将设置为 "MATCH_PARENT",高度将设置为 "WRAP_CONTENT"。在实例 B 中,LayoutParams 将是父视图应用的任何默认值(宽度和高度通常为 WRAP_CONTENT)。
此外,在实例 A 中,视图 未附加 到父视图。在实例 B 中,视图 已附加 到父视图。
长话短说,还有其他区别。
public static MyCustomView inflate(ViewGroup parent) {
MyCustomView view = (MyCustomView) LayoutInflater.
from(parent.getContext()).inflate(R.layout.my_custom_view, parent, false);
return view;
}
这有几件事:
- 膨胀视图,为其提供父级的布局参数。如果
parent 是一个 FrameLayout,那么 LayoutParams 实例将是一个
FrameLayout.LayoutParams
。如果是 LinearLayout,则 LayoutParams 将是LinearLayout.LayoutParams
。布局 参数由 xml "layout_width" 和 "layout_height"。在这种特殊情况下,宽度设置为MATCH_PARENT
,高度设置为WRAP_CONTENT
(尽管这可以被父视图覆盖)。 - 视图未添加或附加到父视图,如下所示
false
参数。 (true
会将视图附加到父级)。 - 您最终应用于 XML 的任何其他属性都将应用于 查看。
- 将应用备用构造函数,因此不同
属性将被填充。调用哪个构造函数取决于您应用的属性。
View#(Context context, AttributeSet attrs)
View#(Context context, AttributeSet attrs, int defStyleAttr)
View#(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes)
另一方面:
public static MyCustomView inflate(ViewGroup parent) {
MyCustomView view = new MyCustomView(parent.getContext());
parent.addChild(view);
return view;
}
- 默认 LayoutParams 将应用于子视图。在大多数情况下,宽度和高度都设置为
WRAP_CONTENT
,但这取决于父视图。 - 视图已附加到父视图。如果调用者试图将其添加到另一个父视图,则会导致崩溃。
- 绝对没有附加属性应用于视图。必须手动添加它们。
- 创建时只使用了
View#(Context context)
构造函数。