Kotlin之"零"xml文件的CommonSelector淺探

最近也開始慢慢的學習些Kotlin的知識堡纬,畢竟人家Google認了親兒子须教,我們做小弟的沒有理由忽略這一事實墅诡,所以決定開始慢慢探索Kotlin中未知的世界序臂。
就拿最近一直在研究的CommonSelector的例子拂盯,來說說個人對Kotlin知識點的理解。

構造一個CommonSelector

var popupWindow: PopupWindow? = null
var popupWindowView: View? = null
var listview: ListView? = null
var linearlayout: LinearLayout? = null
var params: LinearLayout.LayoutParams? = null
var paramstv: LinearLayout.LayoutParams? = null
var textv: TextView? = null
/**
 * CommonSelector簡單的選擇器
 * @param activity 當前界面activity
 * @param v popwindow顯示位置的參照物
 * @param list popwindow上顯示的數據
 * @param callback 回調接聽卵惦,將選擇的數據穿出進行相應操作
 */
class CommonSelector(activity: Activity, val v: View, val list: ArrayList<String>, val callback: OnSelectClickListener) {
    init{
                  //to do something
          }
}

因為kotlin中的類定義同時也是構造函數阻肿,這個時候是不能進行操作的,所以kotlin增加了一個新的關鍵字init用來處理類的初始化問題沮尿,init模塊中的內容可以直接使用構造函數的參數丛塌。

代碼構建一個View

然后我們進行to do something,思路如下:
1畜疾、先構建一個顯示的View赴邻,后面為了放入PopWindow
2啡捶、構建一個PopWindow姥敛,進行PopWindow的一些設置。
3瞎暑、對PopWindow上的控件進行監(jiān)聽彤敛,并進行一些操作。
4了赌、對PopWindow進行顯示墨榄,并控制在父控件的相對位置

 init {
        /**顯示的布局**/
        //設置LinearLayout布局
        linearlayout = LinearLayout(activity)
        params = LinearLayout.LayoutParams(matchParent, matchParent)
        params!!.margin = 30
        params!!.gravity = Gravity.BOTTOM
        linearlayout!!.layoutParams = params
        linearlayout!!.orientation = LinearLayout.VERTICAL
//        var draw: Drawable = ColorDrawable()
//        draw.alpha = 0
//        linearlayout!!.backgroundDrawable = draw
//        linearlayout!!.padding = 30
//        linearlayout!!.background.alpha = 0
//        linearlayout!!.setDrawingCacheBackgroundColor(Color.argb(0, 255, 255, 255))
        linearlayout!!.backgroundColor = Color.argb(255, 0, 255, 0)
        //設置listview布局
        listview = ListView(activity)
        listview!!.layoutParams = params
        listview!!.setBackgroundColor(Color.RED)
        //設置listview的divider的顏色及寬度
        listview!!.divider = ColorDrawable(Color.BLACK)
        listview!!.dividerHeight = 1
        //將listview添加入Linearlayout
        linearlayout!!.addView(listview)
        //設置取消按鈕
        paramstv = LinearLayout.LayoutParams(matchParent, 150)
        paramstv!!.bottomMargin = 30
        paramstv!!.leftMargin = 30
        paramstv!!.rightMargin = 30
        textv = TextView(activity)
        textv!!.text = "取消"
        textv!!.gravity = Gravity.CENTER
        textv!!.layoutParams = paramstv
        textv!!.textSize = 18f
        textv!!.textColor = Color.BLUE
        textv!!.typeface = DEFAULT_BOLD
        textv!!.setBackgroundColor(Color.RED)
        //將取消按鈕添加入Linearlayout
        linearlayout!!.addView(textv)
        initPop()
    }

我花了大片代碼去構建一個View,其實很簡單,如下圖所示:

WechatIMG140.jpeg

【~啪~啪~啪勿她,敲黑板】這里還遺留了一個問題袄秩,在linearlayout!!.backgroundColor = Color.argb(255, 0, 255, 0)這里設置linearlayout的背景,始終無法設置成透明的樣式嫂拴,請教哪位大神能否幫助解決下,感謝感謝??贮喧。Color.argb(0, 0, 255, 0)這樣設置也只能將背景設置成白色筒狠,就是如圖綠色部分,百思不得騎姐啊,架~架~

代碼構建一個popupWindow

  private fun initPop() {
        popupWindowView = (linearlayout as View?)!!
        val dw: ColorDrawable = ColorDrawable(Color.WHITE)
        popupWindow = PopupWindow(popupWindowView, matchParent, wrapContent, true)
        popupWindow!!.setBackgroundDrawable(dw)
        //點擊popipview之外監(jiān)聽事件
        //popupWindow!!.setOnDismissListener { }
        initEvent()
    }

言簡意賅箱沦,每句代碼的意思辩恼,就像人如其名一樣,假如有不懂谓形,可以留言灶伊,一起交流交流。

設置Listviewtexttv的監(jiān)聽事件

    private fun initEvent() {
        var adapterr = TodoAdapter(list)
        listview!!.adapter = adapterr
        listview!!.onItemClick { adapterView, view, i, l ->
            popupWindow!!.dismiss()
            callback.onCommonItemSelect(i)
        }
        //取消按鈕監(jiān)聽事件
        textv!!.onClick { popupWindow!!.dismiss() }
    }

這段代碼中間有一個Lamda表達式寒跳,其中adapterView ``view ``l是指三個參數聘萨,即listview的ItemClick的單機事件,每當單擊Item,即popupWindow執(zhí)行消失動作童太,并且米辐,將需要傳遞數據出去接口處胸完。
【啪啪啪,敲黑板】這里有個TodoAdapter設配置翘贮,我下面詳細說下赊窥。這個也是Kotlin中,亮點之處狸页。(純個人見解)

寫一個popupWindow顯示的方法

    fun showPop(): Unit {
        if (popupWindow!!.isShowing) {
            return
        }
        if (list.size > 7) {
            popupWindow!!.height = 700
        }
        popupWindow!!.showAtLocation(v, Gravity.BOTTOM, 0, 0)
    }

這里我為什么要單獨寫一個方法進行popupWindow的顯示锨能,因為,在我們顯示popupWindow的時候芍耘,將設置它的高度址遇,進行一些設置,顧這樣設計比較合理齿穗,至于popupWindow顯示位置傲隶,有很多中方法,比如“showAtLocation``showAsDropDown”,這個顯示位置窃页,我后面單獨書寫一篇文章來述說跺株。

單獨寫TodoAdapter適配器的類

class TodoAdapter(val list: ArrayList<String>) : BaseAdapter() {
    override fun getView(i: Int, v: View?, parent: ViewGroup?): View {
        return with(parent!!.context) {
            var taskNum: Int = i + 1
            //Layout for a list view item
            linearLayout {
                textView {
                    gravity = Gravity.CENTER
                    text = list[i]
                    textSize = 16f
                    textColor = Color.BLUE
                    padding = dip(5)
                }.lparams(matchParent, wrapContent)
            }

        }
    }
    override fun getItem(position: Int): Any {
        return list[position]
    }
    override fun getItemId(p0: Int): Long {
        return 0L
    }
    override fun getCount(): Int {
        return list.size
    }
}

很奇怪,對吧脖卖,我連xml文件居然都沒有使用到乒省,就可以完成一個適配器的書寫,更奇怪的是畦木,我這個CommonSelector連一個xml文件都沒有使用到袖扛。最重要的部分就是如何返回一個View,如下

        return with(parent!!.context) {
            var taskNum: Int = i + 1
            //Layout for a list view item
            linearLayout {
                textView {
                    gravity = Gravity.CENTER
                    text = list[i]
                    textSize = 16f
                    textColor = Color.BLUE
                    padding = dip(5)
                }.lparams(matchParent, wrapContent)
            }
        }

這里使用了一個Context的擴展方法linearLayout進行了View的實現(xiàn)。詳細的可以進入源代碼進行查看十籍。里面的一些細節(jié)參數設置蛆封,也就順理成章了。假如這里有不懂的勾栗,可以留言一起交流交流惨篱。

整個CommonSelector寫下來,其實其中還是有坑的存在的围俘,就像我的Popwindow的布局為什么不能像適配器里面的布局一樣的寫砸讳,那是因為Context的擴展方法里面已經addview添加進去了一個view,在構建Popwindow的時候界牡,再第二次加入View的時候簿寂,就會報錯了。

不過整個類里面還遺留了一個問題宿亡,就是背景設置成透明的樣式常遂,始終無法實現(xiàn),是否有興趣的朋友一起交流下挽荠,看看如何實現(xiàn)烈钞,這樣就完美了泊碑。

【啪啪啪~敲黑板】「我怎么發(fā)現(xiàn)我一直在敲黑板,哈哈」
整個類沒有用到 xml文檔毯欣,固然需配置一個compile 'org.jetbrains.anko:anko-sdk15:0.9.1'的庫
不過沒有xml文檔馒过,也是純?yōu)榱司毩曊Z法。

針對androidxml文件能不能干掉這一問題酗钞。
anko的布局是一個比較有爭議的東西腹忽,它雖然號稱有性能優(yōu)勢,但我測試過沒有很明顯砚作;另外窘奏,類型安全的優(yōu)勢其實在有 kotlin-android-extensions之后也不明顯了。
但問題在于葫录,它不能實時preview(必須編譯)着裹,而且用起來也不是很簡單,對于初學者其實不是很友好米同。
所以骇扇,官方也是說我們只是提供了一種布局的途徑,并不是說要干掉 xml面粮。

第一次寫簡書少孝,還請各位輕拍,純屬鞏固知識熬苍,交流為目的稍走。
一個簡單的功能,給我寫的這么復雜柴底,我也是醉了婿脸,哈哈~

結尾添加一個 我們應該如何使用它呢?
直接上代碼, 如下

        testtv.onClick {
            commonSelector = CommonSelector(this,
                    testtv,
                    list,
                    object : CommonSelector.OnSelectClickListener {
                        override fun onCommonItemSelect(postions: Int) {
                            toast(list[postions])
                        }
                    })
            commonSelector!!.showPop()
        }
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末柄驻,一起剝皮案震驚了整個濱河市狐树,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌凿歼,老刑警劉巖褪迟,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件冗恨,死亡現(xiàn)場離奇詭異答憔,居然都是意外死亡,警方通過查閱死者的電腦和手機掀抹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進店門虐拓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人傲武,你說我怎么就攤上這事蓉驹〕情唬” “怎么了?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵态兴,是天一觀的道長狠持。 經常有香客問我,道長瞻润,這世上最難降的妖魔是什么喘垂? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮绍撞,結果婚禮上正勒,老公的妹妹穿的比我還像新娘。我一直安慰自己傻铣,他們只是感情好章贞,可當我...
    茶點故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著非洲,像睡著了一般鸭限。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上怪蔑,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天里覆,我揣著相機與錄音,去河邊找鬼缆瓣。 笑死喧枷,一個胖子當著我的面吹牛,可吹牛的內容都是我干的弓坞。 我是一名探鬼主播隧甚,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼渡冻!你這毒婦竟也來了戚扳?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤族吻,失蹤者是張志新(化名)和其女友劉穎帽借,沒想到半個月后,有當地人在樹林里發(fā)現(xiàn)了一具尸體超歌,經...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡砍艾,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了巍举。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片脆荷。...
    茶點故事閱讀 38,622評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出蜓谋,到底是詐尸還是另有隱情梦皮,我是刑警寧澤,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布桃焕,位于F島的核電站剑肯,受9級特大地震影響,放射性物質發(fā)生泄漏观堂。R本人自食惡果不足惜退子,卻給世界環(huán)境...
    茶點故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望型将。 院中可真熱鬧寂祥,春花似錦、人聲如沸七兜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽腕铸。三九已至惜犀,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間狠裹,已是汗流浹背虽界。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留涛菠,地道東北人莉御。 一個月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像俗冻,于是被迫代替她去往敵國和親礁叔。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,490評論 2 348

推薦閱讀更多精彩內容