Ich versuche, eine benutzerdefinierte Ansicht zu erstellen, die ein bestimmtes Layout ersetzt, das ich an mehreren Stellen verwende, aber ich habe Schwierigkeiten, dies zu tun.
Grundsätzlich möchte ich dies ersetzen:
<RelativeLayout
android:id="@+id/dolphinLine"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:background="@drawable/background_box_light_blue"
android:padding="10dip"
android:layout_margin="10dip">
<TextView
android:id="@+id/dolphinTitle"
android:layout_width="200dip"
android:layout_height="100dip"
android:layout_alignParentLeft="true"
android:layout_marginLeft="10dip"
android:text="@string/my_title"
android:textSize="30dip"
android:textStyle="bold"
android:textColor="#2E4C71"
android:gravity="center"/>
<Button
android:id="@+id/dolphinMinusButton"
android:layout_width="100dip"
android:layout_height="100dip"
android:layout_toRightOf="@+id/dolphinTitle"
android:layout_marginLeft="30dip"
android:text="@string/minus_button"
android:textSize="70dip"
android:textStyle="bold"
android:gravity="center"
android:layout_marginTop="1dip"
android:background="@drawable/button_blue_square_selector"
android:textColor="#FFFFFF"
android:onClick="onClick"/>
<TextView
android:id="@+id/dolphinValue"
android:layout_width="100dip"
android:layout_height="100dip"
android:layout_marginLeft="15dip"
android:background="@android:drawable/editbox_background"
android:layout_toRightOf="@+id/dolphinMinusButton"
android:text="0"
android:textColor="#2E4C71"
android:textSize="50dip"
android:gravity="center"
android:textStyle="bold"
android:inputType="none"/>
<Button
android:id="@+id/dolphinPlusButton"
android:layout_width="100dip"
android:layout_height="100dip"
android:layout_toRightOf="@+id/dolphinValue"
android:layout_marginLeft="15dip"
android:text="@string/plus_button"
android:textSize="70dip"
android:textStyle="bold"
android:gravity="center"
android:layout_marginTop="1dip"
android:background="@drawable/button_blue_square_selector"
android:textColor="#FFFFFF"
android:onClick="onClick"/>
</RelativeLayout>
Dadurch:
<view class="com.example.MyQuantityBox"
android:id="@+id/dolphinBox"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:myCustomAttribute="@string/my_title"/>
Ich möchte also kein benutzerdefiniertes Layout, sondern eine benutzerdefinierte Ansicht (es sollte nicht möglich sein, dass diese Ansicht ein untergeordnetes Element hat).
Das einzige, was sich von einer Instanz einer MyQuantityBox zu einer anderen ändern kann, ist der Titel. Ich würde dies sehr gerne im XML angeben können (wie in der letzten XML-Zeile).
Wie kann ich das machen? Sollte ich das RelativeLayout in einer XML-Datei in / res / layout ablegen und in meiner MyBoxQuantity-Klasse aufblasen? Wenn ja, wie mache ich das?
Vielen Dank!
Antworten:
Ja, das kannst du machen. RelativeLayout, LinearLayout usw. sind Ansichten, sodass ein benutzerdefiniertes Layout eine benutzerdefinierte Ansicht ist. Nur etwas zu beachten, denn wenn Sie ein benutzerdefiniertes Layout erstellen möchten, können Sie dies tun.
Sie möchten ein zusammengesetztes Steuerelement erstellen. Sie erstellen eine Unterklasse von RelativeLayout, fügen alle unsere Komponenten in Code (TextView usw.) ein und können in Ihrem Konstruktor die aus dem XML übergebenen Attribute lesen. Sie können dieses Attribut dann an Ihren Titel TextView übergeben.
http://developer.android.com/guide/topics/ui/custom-components.html
quelle
Ein bisschen alt, aber ich dachte, ich würde teilen, wie ich es machen würde, basierend auf der Antwort von chubbsondubs: Ich verwende
FrameLayout
(siehe Dokumentation ), da es verwendet wird, um eine einzelne Ansicht zu enthalten, und fülle die Ansicht aus der XML-Datei hinein.Code folgt:
quelle
this
3. Parameter)Hier ist eine einfache Demo zum Erstellen einer benutzerdefinierten Ansicht (Compoundview) durch Aufblasen aus XML
attrs.xml
CustomView.kt
custom_layout.xml
Wir sollten verwenden
merge
hier statt ,ConstraintLayout
weilWenn wir
ConstraintLayout
hier verwenden, ist die LayouthierarchieConstraintLayout
->ConstraintLayout
->ImageView
+TextView
=> wir haben 1 redundanteConstraintLayout
=> nicht sehr gut für die LeistungVerwenden von activity_main.xml
Ergebnis
Github-Demo
quelle
Verwenden Sie den LayoutInflater wie unten gezeigt.
quelle
In der Praxis habe ich festgestellt, dass Sie etwas vorsichtig sein müssen, insbesondere wenn Sie wiederholt ein bisschen XML verwenden. Angenommen, Sie haben eine Tabelle, für die Sie für jeden Eintrag in einer Liste eine Tabellenzeile erstellen möchten. Sie haben einige XML-Dateien eingerichtet:
In
my_table_row.xml
:Dann möchten Sie es einmal pro Zeile mit etwas Code erstellen. Es wird davon ausgegangen, dass Sie ein übergeordnetes TableLayout myTable definiert haben, an das die Zeilen angehängt werden sollen.
Ein klares, einfaches Beispiel für die Behandlung von rowButton.setOnClickListener (this) finden Sie unter Onclicklistener für eine programmgesteuert erstellte Schaltfläche .
quelle