膨胀xml与创建新实例

时间:2015-09-15 17:11:14

标签: android android-view layout-inflater

这两个是否相同?

一个。

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

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);

1 个答案:

答案 0 :(得分:2)

不完全是。长话短说,这里的差异在实例A中,LayoutParams将被设置为&#34; MATCH_PARENT&#34;对于宽度和&#34; WRAP_CONTENT&#34;为了高度。在实例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&#34; layout_width&#34;分配。和 &#34; layout_height&#34 ;.在这种特殊情况下,宽度设置为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)
  5. 另一方面:

    public static MyCustomView inflate(ViewGroup parent) {
        MyCustomView view = new MyCustomView(parent.getContext());
        parent.addChild(view);
        return view;   
    }
    
    1. 默认LayoutParams将应用于子视图。在大多数情况下,宽度和高度都设置为WRAP_CONTENT,但是由父视图决定哪个。{/ li>
    2. 视图已附加到父视图。如果调用者试图将其添加到另一个父视图,则会导致崩溃。
    3. 绝对没有其他属性应用于视图。它们必须手动添加。
    4. 在创建中仅使用View#(Context context)构造函数。