So erweitern Sie LinearLayout richtig, um eine benutzerdefinierte Ansicht zu erstellen

Ich habe eine "Karte", die ein einfaches LinearLayout mit einem TextView darin ist

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

dann habe ich mein Hauptfragment mit einem vertikalen LinearLayout .. und in diesem Hauptfragment füge ich diese "Karten" zum Hauptlayout hinzu:

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

Das funktioniert sehr gut UND meine Karte füllt die gesamte Breite des Fragmentlayouts aus. Eigentlich was ich erwarte.

Jetzt habe ich eine eigene Klasse für meine Karte erstellt:

Class Card extends LinearLayout{

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

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

        this.addView(view);

    }
}

Und wenn ich dann meine Karte auf folgende Weise zum Hauptfragment-Layout hinzufüge:

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

dann wird es hinzugefügt, ABER die Breite der Karte wird nicht mehr ausgefüllt, sondern in die Textansicht eingepackt.

Könnte mir bitte jemand erklären, warum ich durch diese beiden Methoden zum Hinzufügen gleicher Layouts unterschiedliche Breitengrößen erhalte?

Lösung Hier ist eine geänderte Kartenklasse, die dieses Problem löst:

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

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

Antworten auf die Frage(1)

Ihre Antwort auf die Frage