Die Android-App, die ich gerade entwickle, hat eine Hauptaktivität, die ziemlich groß geworden ist. Dies liegt vor allem daran, dass es eine TabWidget
mit 3 Tabs enthält. Jede Registerkarte hat einige Komponenten. Die Aktivität muss alle diese Komponenten gleichzeitig kontrollieren. Ich denke, man kann sich vorstellen, dass diese Aktivität 20 Felder hat (ein Feld für fast jede Komponente). Es enthält auch eine Menge Logik (klicken Sie auf Listener, Logik, um Listen zu füllen, usw.).Android - Eine benutzerdefinierte (zusammengesetzte) Komponente schreiben
Normalerweise verwende ich in komponentenbasierten Frameworks, um alles in benutzerdefinierte Komponenten aufzuteilen. Jede benutzerdefinierte Komponente hätte dann eine eindeutige Verantwortung. Es würde seinen eigenen Satz von Komponenten und alle anderen mit dieser Komponente verbundenen Logik enthalten.
Ich habe versucht, herauszufinden, wie dies getan werden kann, und ich fand etwas in der Android-Dokumentation, was sie gerne eine "Compound Control" nennen. (Siehe http://developer.android.com/guide/topics/ui/custom-components.html#compound und scrollen Sie zum Abschnitt "Zusammengesetzte Steuerelemente".) Ich möchte eine solche Komponente basierend auf einer XML-Datei erstellen, die die Ansichtsstruktur definiert.
In der Dokumentation heißt es:
Beachten Sie, dass nur mit einer Aktivität mögen, Sie entweder die deklarative (XML-basiert) Ansatz zur Schaffung der Komponenten enthalten können, oder Sie können Nest sie programmatisch aus Ihrem Code.
Nun, das sind gute Nachrichten! Der XML-basierte Ansatz ist genau das, was ich will! Aber es sagt nicht, wie es geht, außer dass es "wie mit einer Aktivität" ist ... Aber was ich in einer Aktivität mache, ist Anruf setContentView(...)
, um die Ansichten von XML aufzublasen. Diese Methode ist nicht verfügbar, wenn Sie beispielsweise die Unterklasse LinearLayout
verwenden. So
Ich habe versucht, die XML manuell wie diese aufzublasen:
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);
}
}
Dies funktioniert, mit Ausnahme der Tatsache, dass die XML Ich bin Laden LinearLayout
als Root-Element deklariert hat. Dies führt dazu, dass das aufgeblasene LinearLayout
ein Kind von MyCompoundComponent
ist, welches selbst bereits ein LinearLayout
ist !! Jetzt haben wir ein redundantes LinearLayout zwischen MyCompoundComponent
und den Ansichten, die es tatsächlich benötigt.
Kann mir bitte jemand einen besseren Weg geben, um das zu erreichen, indem man vermeidet, dass eine redundante LinearLayout
Instanz erstellt wird?
Ich liebe Fragen, von denen ich etwas lerne. Vielen Dank. –
Ich schrieb vor kurzem einen Blog-Eintrag dazu: http://blog.jteam.nl/2009/10/08/exploring-the-world-of-android-part-3/ –