Die Android-App, die ich gerade entwickle, hat eine Hauptaktivität, die ziemlich groß geworden ist. Dies liegt hauptsächlich daran, dass es eine TabWidgetmit 3 Registerkarten enthält. Jede Registerkarte enthält einige Komponenten. Die Aktivität muss alle diese Komponenten gleichzeitig steuern. Ich denke, Sie können sich vorstellen, dass diese Aktivität etwa 20 Felder enthält (ein Feld für fast jede Komponente). Außerdem enthält es viel Logik (klicken Sie auf Listener, Logik zum Füllen von Listen usw.).
Was ich normalerweise in komponentenbasierten Frameworks mache, ist, alles in benutzerdefinierte Komponenten aufzuteilen. Jede benutzerdefinierte Komponente hätte dann eine klare Verantwortung. Es würde einen eigenen Satz von Komponenten und alle anderen mit dieser Komponente verbundenen Logik enthalten.
Ich habe versucht herauszufinden, wie dies gemacht werden kann, und ich habe in der Android-Dokumentation etwas gefunden, was sie gerne als "Compound Control" bezeichnen. (Siehe http://developer.android.com/guide/topics/ui/custom-components.html#compound und scrollen Sie zum Abschnitt "Compound Controls".) Ich möchte eine solche Komponente basierend auf einer XML-Datei erstellen, die das definiert Struktur anzeigen.
In der Dokumentation heißt es:
Beachten Sie, dass Sie wie bei einer Aktivität entweder den deklarativen (XML-basierten) Ansatz zum Erstellen der enthaltenen Komponenten verwenden oder sie programmgesteuert aus Ihrem Code verschachteln können.
Das sind gute Neuigkeiten! Der XML-basierte Ansatz ist genau das, was ich will! Aber es sagt nicht, wie es geht, außer dass es "wie bei einer Aktivität" ist ... Aber was ich in einer Aktivität mache, ist der Aufruf setContentView(...), die Ansichten aus XML aufzublasen. Diese Methode ist nicht verfügbar, wenn Sie beispielsweise eine Unterklasse verwenden LinearLayout.
Also habe ich versucht, das XML manuell wie folgt 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 das von mir geladene XML als Stammelement LinearLayoutdeklariert wurde. Dies führt dazu, dass das aufgeblasene LinearLayoutKind ist, von MyCompoundComponentdem selbst schon ein LinearLayout!! Jetzt haben wir ein redundantes LinearLayout dazwischen MyCompoundComponentund die Ansichten, die es tatsächlich benötigt.
Kann mir bitte jemand einen besseren Weg bieten, um dies zu erreichen und zu vermeiden, dass eine redundante LinearLayoutInstanziierung durchgeführt wird?