2015-09-15 2 views
0

Эти два одинаковых?Надувание xml против создания нового экземпляра

А.

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

ответ

2

Не совсем. Короче говоря, различия здесь в примере 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. Надувает вид дает его макет параметров родителя. Если родителем является 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).
+0

Благодарим за подробный ответ. Это очень полезно! – Aks