像 anko layout 一樣寫布局

anko

如果不了解anko 的 可以去上面的鏈接看下anko 如何寫布局的虏杰。

簡單實現(xiàn)

首先,Kotlin的擴展函數(shù)功能是我們實現(xiàn)anko 的基礎(chǔ)條件勒虾。
以下實現(xiàn)一個 ViewGroup (LinearLayout) 和 一個 View (TextView)
View 的最簡單創(chuàng)建需要 Context纺阔,可能是 Activity 的 或者是 View Parent 的。
所以我們需要對 Context ViewGroup 進行擴展修然。(以下代碼都是 在 Ui.kt 下面建的)

private inline fun <reified T : View> Context.handleView(view: T, init: T.() -> Unit): T{
    view.init()
    return view
}

private inline fun <reified T : View> ViewGroup.handleView(view: T, init: T.() -> Unit): T{
    view.init()
    this.addView(view)
    return view
}

如果是從ViewGroup 來的話 還需要把控件添加上去州弟。
接著寫一個 LinearLayout 和 TextView 的擴展

fun Context.linearLayout(init : LinearLayout.() -> Unit): LinearLayout {
    return this.handleView(LinearLayout(this), init)
}

fun ViewGroup.linearLayout(init : LinearLayout.() -> Unit): LinearLayout {
    return this.handleView(LinearLayout(this.context), init)
}

fun Context.text(init : TextView.() -> Unit): TextView{
    return this.handleView(TextView(this), init)
}

fun ViewGroup.text(init : TextView.() -> Unit): TextView{
    return this.handleView(TextView(this.context), init)
}

然后寫一個布局參數(shù)

fun <T: View> T.lparams(
        width: Int = android.view.ViewGroup.LayoutParams.WRAP_CONTENT,
        height: Int = android.view.ViewGroup.LayoutParams.WRAP_CONTENT,
        marginTop: Int = 0,
        marginLeft: Int = 0,
        marginRight: Int = 0,
        marginBottom: Int = 0
): T {
    val layoutParams = LinearLayout.LayoutParams(width, height)
    layoutParams.setMargins(marginLeft, marginTop, marginRight, marginBottom)
    this.layoutParams = layoutParams
    return this
}

寫 onClick

fun android.view.View.onClick(l: (v: android.view.View?) -> Unit) {
    setOnClickListener(l)
}

寫 padding

fun noGetter(): Nothing = throw IllegalAccessException("Property does not have a getter")

var android.view.View.padding : Int
    set(value) {
        setPadding(value, value, value, value)
    }
    @Deprecated("Property does not have a getter", level = DeprecationLevel.ERROR)
    get() = noGetter()

現(xiàn)在就可以使用了

val layout = linearLayout {
            orientation = LinearLayout.VERTICAL
            padding = 40
            text {
                text = "H0"
                textSize = 16f
                onClick {
                }
            }
            linearLayout {
                lparams(marginTop = 30)
                orientation = LinearLayout.HORIZONTAL
                text {
                    text = "H1"
                }
                text {
                    lparams(marginLeft = 20)
                    text = "H2"
                }
            }
        }
container.addView(layout)

當然也可以擴展 Activity 然后直接添加到 content view 上面钧栖,我這里沒寫。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末婆翔,一起剝皮案震驚了整個濱河市拯杠,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌啃奴,老刑警劉巖潭陪,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異最蕾,居然都是意外死亡依溯,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進店門瘟则,熙熙樓的掌柜王于貴愁眉苦臉地迎上來黎炉,“玉大人,你說我怎么就攤上這事醋拧】妒龋” “怎么了?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵丹壕,是天一觀的道長庆械。 經(jīng)常有香客問我,道長菌赖,這世上最難降的妖魔是什么缭乘? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮琉用,結(jié)果婚禮上堕绩,老公的妹妹穿的比我還像新娘。我一直安慰自己邑时,他們只是感情好逛尚,可當我...
    茶點故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著刁愿,像睡著了一般。 火紅的嫁衣襯著肌膚如雪到逊。 梳的紋絲不亂的頭發(fā)上铣口,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天,我揣著相機與錄音觉壶,去河邊找鬼脑题。 笑死,一個胖子當著我的面吹牛铜靶,可吹牛的內(nèi)容都是我干的叔遂。 我是一名探鬼主播他炊,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼已艰!你這毒婦竟也來了痊末?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤哩掺,失蹤者是張志新(化名)和其女友劉穎凿叠,沒想到半個月后卵迂,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體跺涤,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年昂灵,在試婚紗的時候發(fā)現(xiàn)自己被綠了舱禽。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片炒刁。...
    茶點故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖誊稚,靈堂內(nèi)的尸體忽然破棺而出翔始,到底是詐尸還是另有隱情,我是刑警寧澤片吊,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布绽昏,位于F島的核電站,受9級特大地震影響俏脊,放射性物質(zhì)發(fā)生泄漏全谤。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一爷贫、第九天 我趴在偏房一處隱蔽的房頂上張望认然。 院中可真熱鬧,春花似錦漫萄、人聲如沸卷员。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽毕骡。三九已至,卻和暖如春岩瘦,著一層夾襖步出監(jiān)牢的瞬間未巫,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工启昧, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留叙凡,地道東北人。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓密末,卻偏偏與公主長得像握爷,于是被迫代替她去往敵國和親跛璧。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,724評論 2 354

推薦閱讀更多精彩內(nèi)容