Ich habe das folgende Layout mit dem Namen
sample_layout.xml
und ich möchte verwenden Sie es mehrmals, aber jedes Mal mit ein paar Änderungen.Gibt es eine andere Möglichkeit, dasselbe Layout mit anderen Attributen in Android Studio mehrmals zu verwenden, außer DataBinding?<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" android:layout_marginBottom="20dp"> <RelativeLayout android:layout_width="match_parent" android:layout_height="110dp" android:background="@drawable/full_panel_blue" android:padding="10dp" android:layout_marginBottom="20dp"> <ImageView android:layout_width="120dp" android:layout_height="120dp" android:src="@mipmap/first_icon" /> <LinearLayout android:layout_width="350dp" android:layout_height="fill_parent" android:layout_alignParentRight="true" android:gravity="end" android:orientation="vertical"> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:textColor="@color/my_white" android:text="4000000" android:textSize="50sp" android:gravity="end"/> <TextView android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="end" android:textColor="@color/my_white" android:textSize="20sp" android:text="Sample text" /> </LinearLayout> </RelativeLayout> </LinearLayout>
Lower ist das Layout, wo es mehrere Male
<LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <include layout="@layout/sample_layout"/> <include layout="@layout/sample_layout"/> <include layout="@layout/sample_layout"/> </LinearLayout>
So enthalten sein wird, möchte ich es erstmals schließen, wie es ist, aber die zweite Zeit anstelle der
@drawable/full_blue_panel
, möchte ich eine andere ziehbare (@drawable/red_w_transparency
) verwenden. Und auch für dieImageView
Ich möchte ein anderessrc
für das Symbol zum zweiten Mal verwenden, und ein anderes zum dritten Mal. Vielleicht verschiedene Texte in derTextView
jedes Mal und so weiter für eines der zuvor erstellten Attribute. Ich habe bereits versucht, etwas mit DataBinding , aber ich glaube nicht, dass es genau dafür geeignet ist. Gibt es einen anderen Weg dazu?
Antwort
Im Allgemeinen löse ich diese Art von Problem, indem ich eine benutzerdefinierte View
Unterklasse erstellen. Die Grundlagen werden hier behandelt:
Die kurze Version ist, dass Sie einige benutzerdefinierte Attribute definieren, die die Teile beeinflussen, die Sie ändern möchten, und erstellen Sie dann eine View
Unterklassenimplementierung, die diese Attribute liest, um seine Ansichtshierarchie zu ändern.
In Ihrem informierten Beispiel: Sie haben diese relevanten Punkte:
- Die Wurzel ist ein
LinearLayout
- Sie wollen den
- Sie mögen die
ImageView
src - Sie ändern möchte die
TextView
Text
RelativeLayout
Hintergrund ändern
attrs.xml
erstellen:
<declare-styleable name="MyCompoundComponent">
<attr name="background"/>
<attr name="imageSrc"/>
<attr name="primaryText"/>
</declare-styleable>
Als nächst Sie die Ansicht Klasse erstellen. Da Ihre Wurzel des Original-Layout LinearLayout
war, werden wir davon ableiten:
public class MyCompoundComponent extends LinearLayout {
public MyCompoundComponent(Context context, AttributeSet attrs) {
super(context, attrs);
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.MyCompoundComponent);
// read your attributes
a.recycle();
inflate(context, R.layout.my_compound_component, this);
// find your views, use your attributes to modify them
}
}
Und natürlich müssen Sie ein Layout. Sie können einfach den oben angegebenen verwenden, außer dass Sie das Root-Element in <merge>
ändern würden, jetzt, wo Sie es in einem LinearLayout
aufblasen.
Damit alles an seinem Platz, können Sie diese Ansicht in der anderen Layouts verwenden wie jede andere Ansicht:
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<com.example.stackoverflow.MyCompoundComponent
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:background="@color/blue"
app:imageSrc="@drawable/image1"
app:primaryText="@string/text1"/>
<com.example.stackoverflow.MyCompoundComponent
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:background="@color/red"
app:imageSrc="@drawable/image2"
app:primaryText="@string/text2"/>
</LinearLayout>
- 1. Android XML Gibt es eine Möglichkeit, den Werkzeug-Namespace mit benutzerdefinierten Attributen zu verwenden?
- 2. Android - Gibt es eine bessere Möglichkeit, dieses Layout zu erstellen?
- 3. Gibt es eine bessere Möglichkeit, eine Zeichenfolge mehrmals zu suchen?
- 4. Gibt es eine bessere Möglichkeit, dieses Layout zu erstellen? Vielleicht Constraint Layout verwenden?
- 5. Gibt es eine andere Möglichkeit, die Abhängigkeit .aar in Android-Projekten zu verwenden?
- 6. Gibt es andere Android-Geräte mit Leanback-Funktion außer AndroidTV?
- 7. Abgesehen von Absicht gibt es eine andere Möglichkeit, Daten über Aktivitäten in Android Studio
- 8. Gibt es eine Möglichkeit, alle Fenster außer einem zu minimieren?
- 9. Mehrfache vor Anweisungen. Gibt es eine Möglichkeit, weniger Code zu verwenden, um dasselbe zu tun?
- 10. gibt es eine Möglichkeit, Abhängigkeiten zu verwenden Injektion mit Typoskript
- 11. Gibt es eine Möglichkeit, neue DrawerLayout mit ActionBarSharlock zu verwenden?
- 12. Gibt es eine Möglichkeit, PHP WebSocket in Heroku zu verwenden? Es scheint standardmäßig gibt es nur Unterstützung für andere Technologien
- 13. android - mit DataBinding, auf Aktivität statt Layout
- 14. Gibt es eine Möglichkeit, das Bild mehrmals als Kacheln in Android zu wiederholen?
- 15. Gibt es eine Möglichkeit, zu viele andere Bedingungen zu entfernen?
- 16. Gibt es eine Möglichkeit, mehrere Attribute von Android-Layout auf einmal zu finden und zu löschen
- 17. Gibt es eine andere einfachere Möglichkeit, dieses Programm zu schreiben?
- 18. Gibt es eine Möglichkeit, Asterisk oder eine andere Soft PBX in Android-Telefon zu installieren?
- 19. Gibt es eine Möglichkeit, SearchView in Fragment zu verwenden?
- 20. Gibt es eine andere Möglichkeit, Repaint() in Java zu tun?
- 21. Gibt es eine Möglichkeit, `dynamic` in Lambda-Ausdrucksbaum zu verwenden?
- 22. Gibt es eine Möglichkeit, Layouts zu animieren? [Android]?
- 23. Gibt es eine Möglichkeit mit FireMonkey Android-Support-V4 zu verwenden, die mit Marshmallow geht?
- 24. Gibt es eine Möglichkeit, eine Testdatenbank in Katalysator zu verwenden?
- 25. Gibt es Gründe, nicht mit Android Studio Lombok zu verwenden
- 26. Gibt es eine Möglichkeit, userInterations in Android-Fragmenten zu erkennen?
- 27. Gibt es eine Möglichkeit, die Zwischenablage in Monogame zu verwenden?
- 28. Gibt es eine grafische Möglichkeit, Schaltflächen mit Ereignissen in Android Studio zu verbinden?
- 29. Gibt es eine Möglichkeit, meine Android-Wear Verbindung mit MYSQL
- 30. Es gibt eine Möglichkeit, eine Zeile in SQLite Cursor in Android als Trennzeichen zu verwenden?
ok, ich habe alles getan, aber immer noch nicht, den ich sehe, wie es würde wissen, was ' imageSrc' wird im benutzerdefinierten Layout geändert, da es zwei 'ImageView' gibt, oder wie weiß es, welcher Text geändert werden muss, da es mehr in der benutzerdefinierten Ansicht gibt (und verschachtelt sind). –
Erstellen Sie mehrere Attribute. Sie können einen beliebigen Namen verwenden, zB ' ' und ' ' oder ' ' vs '< attr name = "foreground" /> 'usw. Dann können Sie diese im Code abrufen und sie den richtigen Ansichten zuordnen. –