Wenn wir uns Anko-Quellen ansehen, können wir sehen, dass frameLayout
tatsächlich eine Instanz der _FrameLayout
Klasse zurückgibt, wo diese lparams
Funktionen definiert sind. Nach meinem Verständnis ist dies erforderlich, so dass diese lparams
Funktionen nur im Layout-Baucode verfügbar sind.
In Ankos Layouts.kt
Datei gibt es diese _<ViewGroup>
Klassen für jede unterstützte ViewGroup
.
So die einfache Möglichkeit, eine benutzerdefinierte Ansicht Gruppe zu unterstützen, ist eine _<ViewGroup>
Klasse mit lparams
Methoden Implementierung zu erstellen. Das Problem ist, dass diese _<ViewGroup>
Klasse oft viel mehr Code enthält als meine <ViewGroup>
selbst!
Und wenn ich viele benutzerdefinierte Ansichtsgruppen erstellen möchte, wird das Hinzufügen von Anko-Unterstützung für sie zu einem großen Schmerz bei diesem Ansatz. Nehmen wir an, ich habe MyFrameLayout1
, MyFrameLayout2
, MyFrameLayout3
Klassen. Sie sind im Grunde FrameLayout
's, so möchte ich die gleichen Layout-Parameter mit ihnen verwendet werden. Aber ich muss _FrameLayout1
, _FrameLayout2
, _FrameLaoyt3
Klassen erstellen, die nur kopieren/einfügen von Ankos _FrameLayout
sind.
Also habe ich diesen Ansatz etwas verbessert.Ich erstelle ein interface _FrameLayout
:
interface _FrameLayout {
// copy/paste from Anko's _FrameLayout
}
und jetzt alle benutzerdefinierten FrameLayout
Unterklasse zu unterstützen, ich habe gerade zu:
class _MyFrameLayout(ctx: Context) : MyFrameLayout(ctx), _FrameLayout
fun ViewManager.myFrameLayout(init: _MyFrameLayout.() -> Unit = {})= ankoView({ _MyFrameLayout(it) }, init)
Diese Kopie reduziert/viel einfügen, wenn viele benutzerdefinierte Ansicht Gruppen zu schaffen.
Ich habe ein Problem darüber https://github.com/Kotlin/anko/issues/152 eingereicht – netimen