15

ich eine „Karte“ habe, das ist eine einfache Linearlayout mit einem Textview innerhalb, wie man richtig Linearlayout Erweitern eine benutzerdefinierte Ansicht erstellen

<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 Haupt Fragment mit einem vertikalen Linearlayout .. und in ich das Haupt-Fragment dieses „Karten“ in das 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 Fragments Layout. Eigentlich was ich erwarte.

Jetzt habe ich eine separate Klasse für meine Karte:

Class Card extends LinearLayout{ 

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

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

     this.addView(view); 

    } 
} 

Und dann, wenn ich meine Karte mit dem Haupt Fragment-Layout in der Art und Weise hinzufügen:

# 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 hinzugefügt, ABER Die Breite der Karte wird nicht mehr ausgefüllt, sondern in die Textansicht übernommen.

Könnte mir bitte jemand erklären, warum ich verschiedene Breitengrößen durch diese zwei Methoden zum Hinzufügen der gleichen Layouts bekomme?

Lösung hier ist Klasse Karte geändert, die dieses Problem löst:

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

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

Sind Sie sicher, dass Ihre 'Card' Breite verändert und nicht' LinearLayout'? – eleven

+0

ja. Ich vereinfachte die Frage zum besseren Verständnis, da ich mit komplexeren Dingen arbeite. Aber die Sache ist, dass die "Karte" direkt zum Layout und über eine neue Klasse hinzugefügt wird - mit anderen Ergebnissen. Ich nehme an, dass die Eltern-Layout-Breite durch Hinzufügen einer neuen Klasse irgendwie nicht verifiziert werden konnte. – user1908375

Antwort

15

Das ist nicht der richtige Weg ist eine benutzerdefinierte Ansicht Klasse zu implementieren. In Ihrer Implementierung der Card-Klasse erstellen Sie tatsächlich ein zusätzliches LinearLayout, das nicht benötigt wird.

Implementieren Sie zuerst Ihre Card-Klasse, die LinearLayout erweitert. Dann verweisen Sie in Ihrem XML-Layout wie solche:

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

Here's a good tutorial on creating custom views in android.

Verwandte Themen