Правильное расширение LinearLayout для создания пользовательского представления

У меня есть некоторая "карта", которая представляет собой простой LinearLayout с TextView внутри

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:card="http://schemas.android.com/apk/res-auto"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
>
 <TextView
        android:id="@+id/card_label_txt"
        android:layout_width="wrap_content"
        android:text="label" />
</LinearLayout>

то у меня есть мой основной фрагмент с вертикальным LinearLayout.. и в этом основном фрагменте я добавляю эти "карты" в основной макет:

# main fragment layout
View view = inflater.inflate(R.layout.main_activity, null);
LinearLayout ll = (LinearLayout) view
                .findViewById(R.id.main_activity_ll);
# get card
View card = inflater.inflate(R.layout.card, null);

# add to fragment layout
ll.addView(card);

это работает очень хорошо, и моя карта заполняет всю ширину фрагмента. На самом деле я ожидаю.

Теперь я создал отдельный класс для своей карты:

Class Card extends LinearLayout{

public Card(Context context) {
        super(context);

        View view =  LayoutInflater.from(getContext()).inflate(
                R.layout.card, null);

        this.addView(view);

    }
}

И, если я добавлю свою карту в макет основного фрагмента следующим образом:

# main fragment layout
View view = inflater.inflate(R.layout.main_activity, null);
LinearLayout ll = (LinearLayout) view
                .findViewById(R.id.main_activity_ll);

# add new Card to fragment layout
ll.addView(new Card(getActivity());

то он добавляется, но ширина карты больше не заполняется, а вставляется в текстовое окно.

Может кто-нибудь объяснить мне, почему я получаю разные размеры ширины этим двумя способами добавления одинаковых макетов?

Решение здесь изменен класс карты, который решает эту проблему:

public Card(Context context) {
       super(context);

       LayoutInflater.from(getContext()).inflate(
                R.layout.card, this);
    }
}

Ответы

Ответ 1

Это не правильный способ реализации пользовательского класса View. В вашей реализации класса Card вы фактически создаете дополнительный LinearLayout, который не нужен.

Во-первых, реализуйте класс вашей карты, который расширяет LinearLayout. Затем ссылайтесь на него в своем XML-макете, например:

<com.mypackagename.Card xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:card="http://schemas.android.com/apk/res-auto"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content" >
 <TextView
        android:id="@+id/card_label_txt"
        android:layout_width="wrap_content"
        android:text="label" />
</com.mypackagename.Card>

Вот хороший учебник по созданию пользовательских представлений в android.