膨胀 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;
  }

这有几件事:

  1. 膨胀视图,为其提供父级的布局参数。如果 parent 是一个 FrameLayout,那么 LayoutParams 实例将是一个 FrameLayout.LayoutParams。如果是 LinearLayout,则 LayoutParams 将是 LinearLayout.LayoutParams。布局 参数由 xml "layout_width" 和 "layout_height"。在这种特殊情况下,宽度设置为 MATCH_PARENT,高度设置为 WRAP_CONTENT(尽管这可以被父视图覆盖)。
  2. 视图添加或附加到父视图,如下所示 false 参数。 (true 会将视图附加到父级)。
  3. 您最终应用于 XML 的任何其他属性都将应用于 查看。
  4. 将应用备用构造函数,因此不同 属性将被填充。调用哪个构造函数取决于您应用的属性。
    1. View#(Context context, AttributeSet attrs)
    2. View#(Context context, AttributeSet attrs, int defStyleAttr)
    3. 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;   
}
  1. 默认 LayoutParams 将应用于子视图。在大多数情况下,宽度和高度都设置为 WRAP_CONTENT,但这取决于父视图。
  2. 视图已附加到父视图。如果调用者试图将其添加到另一个父视图,则会导致崩溃。
  3. 绝对没有附加属性应用于视图。必须手动添加它们。
  4. 创建时只使用了View#(Context context)构造函数。