Android - Eine benutzerdefinierte (zusammengesetzte) Komponente schreiben
Android app ich bin derzeit an der Entwicklung hat eine zentrale Aktivität, die inzwischen ziemlich groß. Dies ist vor allem, weil es enthält ein TabWidget
mit 3 tabs. Jedes tab hat durchaus ein paar Komponenten. Die Aktivität hat sich zur Steuerung all dieser Komponenten auf einmal. Also ich denke, man kann sich vorstellen, dass diese Aktivität hat, wie 20 Felder (ein Feld für fast jede Komponente). Auch enthält es eine Menge Logik (klicken Sie auf die Zuhörer, die Logik zu füllen, Listen, etc).
Was ich normalerweise nicht in component based frameworks ist alles geteilt, bis in benutzerdefinierten Komponenten. Jede benutzerdefinierte Komponente wäre dann eine klare Verantwortung. Es enthält seinen eigenen Komponenten und alle anderen Logik-einen Bezug zu dieser Komponente.
Ich versuchte herauszufinden, wie dies geschehen kann, und ich fand etwas, was in der Android-Dokumentation was Sie gerne nenne "Compound Control". (Siehe http://developer.android.com/guide/topics/ui/custom-components.html#compound und navigieren Sie zu dem "Zusammengesetzte Steuerelemente" Abschnitt) ich möchte diese Komponente basiert auf einem XML-Dateien zur Definition der Struktur anzeigen.
In der Dokumentation heißt es:
Beachten Sie, dass nur wie mit einer Aktivität,
Sie können entweder das deklarative
(XML-basierten) Ansatz zur Erstellung der
enthaltenen Komponenten, oder Sie können nest
Sie programmgesteuert aus dem code.
Gut, das sind gute Neuigkeiten! Der XML-basierte Ansatz ist genau das, was ich will!!! Aber es sagt nicht, wie es zu tun, außer dass es ist "wie mit einer Aktivität,"... Aber was mache ich in einer Tätigkeit ist, rufen setContentView(...)
aufblasen, um den Blick von XML. Diese Methode ist nicht verfügbar, wenn Sie beispielsweise eine Unterklasse LinearLayout
.
So, ich versuchte zu Blasen die XML manuell so:
public class MyCompoundComponent extends LinearLayout {
public MyCompoundComponent(Context context, AttributeSet attributeSet) {
super(context, attributeSet);
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
inflater.inflate(R.layout.my_layout, this);
}
}
Dieser Werke, außer der Tatsache, dass das XML, das ich bin laden hat LinearLayout
erklärt wie das root-element. Dies führt in der aufgeblasenen LinearLayout
ein Kind von MyCompoundComponent
das selbst ist schon ein LinearLayout
!! So, jetzt haben wir eine redundante LinearLayout zwischen MyCompoundComponent
und die Ansichten, die es tatsächlich benötigt.
Kann jemand bitte geben Sie mir einen besseren Weg, dies zu nähern, vermeiden, dass eine redundante LinearLayout
instanziiert?
InformationsquelleAutor der Frage Tom van Zummeren | 2009-09-25
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verwenden merge - tag als XML-root -
Lesen Sie diesen Artikel.
InformationsquelleAutor der Antwort bhatt4982
Ich denke, die Art und Weise Sie tun sollen, ist Ihre Klasse Namen wie die XML-root-element:
Und dann haben Sie Ihre Klasse abgeleitet, aus welchem layout Sie verwenden möchten. Beachten Sie, dass wenn Sie mit dieser Methode nicht verwenden Sie das layout inflater hier.
Und dann können Sie Ihre Ansicht in XML-layouts als normal. Wenn Sie möchten, um die Ansicht programmgesteuert ändern Sie aufblasen, um es selbst:
Leider nicht lassen, Sie tun
v = new MyView(context)
denn es scheint nicht ein Weg, um die verschachtelten layouts problem, so dass dies nicht wirklich eine Lösung. Man könnte hinzufügen, eine Methode wie diese zuMyView
um es ein bisschen schöner:Disclaimer: ich kann reden kompletten Schwachsinn.
InformationsquelleAutor der Antwort Timmmm