9. Create your DSL with Kotlin
Main features in Kotlin
To support creating DSL easily
• Extension
• Higher-Order functions
• Lambda with receiver
10. Create your DSL with Kotlin
Extension
fun Context.getResIdFromAttr(attr: Int): Int {
val value = TypedValue()
theme.resolveAttribute(attr, value, true)
return value.resourceId
}
val resId = context.getResIdFromAttr(R.attr.selectableItemBacktround)
fun Context.getResIdFromAttr(attr: Int): Int {
val value = TypedValue()
theme.resolveAttribute(attr, value, true)
return value.resourceId
}
fun Context.getResIdFromAttr(attr: Int): Int {
val value = TypedValue()
theme.resolveAttribute(attr, value, true)
return value.resourceId
}
11. Create your DSL with Kotlin
Higher-Order functions
Takes functions as parameter
fun <T> lock(lock: Lock, body: () -> T): T {
lock.lock()
try {
return body()
} finally {
lock.unlock()
}
}
val result = lock (lock, { someResources.operation() } )
12. Create your DSL with Kotlin
Lambda with receiver
fun buildString(action: StringBuilder.() -> Unit): String {
val sb = StringBuilder()
sb.action()
return sb.toString()
}
buildString {// It is syntax sugar for lambda parameter
this.append(“test”)
this.append(“test”) //’this’ is StringBuilder
}
fun buildString(action: StringBuilder.() -> Unit): String {
val sb = StringBuilder()
sb.action()
return sb.toString()
}
16. Create your DSL with Kotlin
The syntax
settings {
settingGroup {
settingItem {
…
}
…
}
}
settings {
settingGroup {
settingItem {
…
}
…
}
}
settings {
settingGroup {
settingItem {
…
}
…
}
}
Rule1: settings is the root of the UI layoutRule2: settings includes settingGroupRule3: settingGroup includes settingItem
17. Create your DSL with Kotlin
Setting
class Settings(ctx: Context) : _ScrollView(ctx) {
internal val rootContainer = verticalLayout().lparams(width = matchParent, height = wrapContent)
fun addGroup(group: SettingGroup) {
rootContainer.addView(group)
}
}
18. Create your DSL with Kotlin
Rule1
inline fun ViewManager.settings(init: Settings.() -> Unit): Setting {
…
val settings = Settings(ctx)
settings.init()
this.addView(settings)
return settings
}
inline fun ViewManager.settings(init: Settings.() -> Unit): Setting {
…
val settings = Settings(ctx)
settings.init()
this.addView(settings)
return settings
}
inline fun ViewManager.settings(init: Settings.() -> Unit): Setting {
…
val settings = Settings(ctx)
settings.init()
this.addView(settings)
return settings
}
settings { //init()
settingGroup {
settingItem {
…
}
…
}
}
19. Create your DSL with Kotlin
SettingGroup
class SettingGroup(ctx: Context) : _LinearLayout(ctx) {
var title: String
…
}
20. Create your DSL with Kotlin
Rule2
inline fun Settings.settingGroup(init: SettingGroup.() -> Unit): SettingGroup {
val settingGroup = SettingGroup(this.context)
settingGroup.init()
…
this.addGroup(settingGroup)
return settingGroup
}
inline fun Settings.settingGroup(init: SettingGroup.() -> Unit): SettingGroup {
val settingGroup = SettingGroup(this.context)
settingGroup.init()
…
this.addGroup(settingGroup)
return settingGroup
}
inline fun Settings.settingGroup(init: SettingGroup.() -> Unit): SettingGroup {
val settingGroup = SettingGroup(this.context)
settingGroup.init()
…
this.addGroup(settingGroup)
return settingGroup
}
21. Create your DSL with Kotlin
SettingItem
class SettingItem(ctx: Context, …) : _LinearLayout(ctx) {
var leftIconResId: Int?
var rightIconResId: Int?
var title: String
var description: String
…
}
22. Create your DSL with Kotlin
Rule3
inline fun SettingGroup.settingItem(…, init: SettingItem.() -> Unit): SettingItem {
…
val settingItem = SettingItem(ctx, …)
settingItem.init()
this.addView(settingItem)
return settingItem
}
inline fun SettingGroup.settingItem(…, init: SettingItem.() -> Unit): SettingItem {
…
val settingItem = SettingItem(ctx, …)
settingItem.init()
this.addView(settingItem)
return settingItem
}
inline fun SettingGroup.settingItem(…, init: SettingItem.() -> Unit): SettingItem {
…
val settingItem = SettingItem(ctx, …)
settingItem.init()
this.addView(settingItem)
return settingItem
}
23. Create your DSL with Kotlin
DEMO Time!
https://github.com/wangyung/android-setting-ui-dsl
24. Create your DSL with Kotlin
Summary
・It is very easy to create custom DSL with Kotlin
・We can use DSL to write readable, maintainable code very easily