2016-10-20 4 views
8

Je veux créer une vue personnalisée qui est juste un emballage de quelques vues Android. J'ai regardé dans la création d'un ViewGroup personnalisé qui gère la disposition de ses vues enfant, mais je n'ai pas besoin d'une telle complexité. Ce que je veux essentiellement à faire est quelque chose comme:Créer une classe View/ViewGroup personnalisée dans Anko DSL

class MainActivity 
verticalLayout { 
    textView { 
    text = "Something that comes above the swipe" 
    } 
    swipeLayout { 
    } 
} 

class SwipeLayout 
linearLayout { 
    textView { 
    text = "Some text" 
    } 
    textView { 
    text = "Another text" 
    } 
} 

La raison en est que je voudrais déplacer le code SwipeLayout dans un fichier séparé, mais ne veux pas faire de choses de mise en page complexe moi-même. Est-ce possible en utilisant Anko?

Modifier: Comme suggéré, Is it possible to reuse a layout in Kotlin Anko résout ce problème si la vue est une disposition racine. Mais comme indiqué dans l'exemple, j'aimerais inclure ceci dans une autre mise en page. Est-ce possible?

+3

double possible de [Est-il possible de réutiliser une mise en page Kotlin Anko] (http://stackoverflow.com/questions/40076956/is-it-possible-to-reuse- a-layout-in-kotlin-anko) – miensol

+1

Je suis d'accord avec @miensol. S'il vous plaît se référer à cette réponse: http://stackoverflow.com/a/40078650/4568679 – Slav

+1

Je suis désolé. Cela aurait dû être correct. Mais que faire si je ne veux pas que ma vue personnalisée soit une mise en page racine? Comme dans l'exemple que j'ai montré, il est inclus dans une autre mise en page. Quand j'essaye de faire cela, je reçois une 'java.lang.IllegalStateException: La vue est déjà définie: org.jetbrains.anko._LinearLayout {8bdb786 V.E ...... ...... I. 0,0-0,0} ' –

Répondre

1

Je cherchais quelque chose comme ça aussi, mais la solution la plus optimale que j'ai trouvé pour des vues personnalisées est quelque chose comme ceci:

public inline fun ViewManager.customLayout(theme: Int = 0) = customLayout(theme) {} 
public inline fun ViewManager.customLayout(theme: Int = 0, init: CustomLayout.() -> Unit) = ankoView({ CustomLayout(it) }, theme, init) 

class CustomLayout(c: Context) : LinearLayout(c) { 
    init { 
     addView(textView("Some text")) 
     addView(textView("Other text")) 
    } 
} 
2

vous pouvez utiliser ViewManager.

fun ViewManager.swipeLayout() = linearLayout { 
    textView { 
    text = "Some text" 
    } 
    textView { 
    text = "Another text" 
    } 
} 

class MainActivity 
    verticalLayout { 
    textView { 
     text = "Something that comes above the swipe" 
    } 
    swipeLayout {} 
}