2016-10-20 18 views
8

Bazı Android Görünümlerinin yalnızca bir sarıcısı olan özel bir Görünüm oluşturmak istiyorum. Çocuk görüşlerinin düzenini yöneten özel bir ViewGroup yaratmaya çalıştım, ancak böyle bir karmaşıklığa ihtiyacım yok.Anko DSL'de özel bir View/ViewGroup sınıfı oluşturma

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

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

nedenle ben ayrı bir dosyaya SwipeLayout kodunu taşımak istediğiniz ama herhangi bir karmaşık düzen Stuff kendim yapmak istiyorum kalmamasıdır: Ne temelde yapmak istiyorum gibi bir şeydir. Anko kullanarak bu mümkün mü?

Düzenleme: Gösterildiği gibi, Is it possible to reuse a layout in Kotlin Anko, görünüm bir kök düzen ise bu sorunu çözer. Fakat örnekte gösterildiği gibi, bunu başka bir düzen içine dahil etmek istiyorum. Mümkün mü?

+3

Olası kopyalar ([mümkün Kotlin Anko bir düzen yeniden mi] http://stackoverflow.com/questions/40076956/is-it-possible-to-reuse- a-layout-in-kotlin-anko) – miensol

+1

@miensol ile katılıyorum. Lütfen şu cevaba bakınız: http://stackoverflow.com/a/40078650/4568679 – Slav

+1

Üzgünüm. Bu iyi olmalıydı. Ancak, özel görünümümün kök düzeni olmasını istemiyorsam ne olur? Gösterdiğim örnekte olduğu gibi başka bir düzende yer alıyor. Bunu yapmaya çalıştığımda, bir java.lang.IllegalStateException alıyorum: Görünüm zaten ayarlanmış: org.jetbrains.anko._LinearLayout {8bdb786 V.E ...... ...... I. 0,0-0,0} ' –

cevap

1

Ben de böyle bir şey arıyordum, ama özel görünümler için bulduğu en optimal çözüm böyle bir şey olur:

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

Eğer ViewManager kullanabilirsiniz.

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

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