Kotlin for android學(xué)習(xí)十一(布局篇):anko-commons

前言

kotlin官網(wǎng)kotlin教程學(xué)習(xí)教程的筆記。
這一節(jié),我們引入一個新庫Anko,Anko庫可以簡化代碼,加快開發(fā)速度,是一個很強大的Kotlin庫。這里我們只需要用anko-commons就行,不需要用全庫。

一、引用anko-commons庫

1.在build.gradle中添加依賴

dependencies {
...
    compile "org.jetbrains.anko:anko-commons:$anko_version"
}

2.在project下的build.gradle中添加版本號

buildscript {
   ...
    ext.anko_version='0.10.2'
}

二、感受下Anko與kotlin的簡化

1. toast

        toast("hello kotlin")
        longToast("long - hello kotlin")

結(jié)合Anko的toast源碼,可以看出,這里使用了擴展函數(shù)。

fun Context.toast(message: CharSequence) = Toast.makeText(this, message, Toast.LENGTH_SHORT).show()

2. alert
(1) 正常alert

alert("標題", "內(nèi)容") {
            yesButton { toast("O(∩_∩)O好的") }
            noButton { toast("╮(╯﹏╰)╭不好") }
 }.show()
//也可以這樣
 alert {
     message = "內(nèi)容"
     title = "標題"
     positiveButton("確定") { toast("已確定") }
     negativeButton("取消") { toast("已取消") }
 }.show()

(2) selector alert

    val fruits = listOf("apple", "orange", "banana")
        selector("what do you like ?", fruits) { dialogInterface, i ->
            toast("so you like ${fruits[i]} ")
}

(3) 自定義alert

        alert {
            customView {
                val  view = View.inflate(this@MainActivity,R.layout.activity_other,null)
                addView(view,ViewGroup.LayoutParams(100,100))
            }
        }.show()
//如果我們支持了 Anko layouts庫,也可以這樣
alert {
    customView {
        editText()
    }
}.show()

3. progress dialog

        indeterminateProgressDialog("加載中").show()

4. findViewById

        val recyclerView:RecyclerView = find(R.id.recyclerview)

5. intent
(1) 使用intent
使用Anko之前

        val intent = Intent(this, OtherActivity::class.java)
        intent.putExtra("id", 5)
        intent.putExtra("name", "me")
        intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP)
        startActivity(intent)

使用Anko之后

        startActivity(intentFor<OtherActivity>("id" to 5,"name" to "me").singleTop())

當然,如果不需要啟動模式就更簡單了

  startActivity<OtherActivity>("id" to 5,"name" to "me")
行為 方式
打電話 makeCall(number: String): Boolean
發(fā)短信 sendSMS(number: String, text: String = ""): Boolean
調(diào)用瀏覽器 browse(url: String, newTask: Boolean = false): Boolean
分享文字 share(text: String, subject: String = ""): Boolean
發(fā)郵件 email(email: String, subject: String = "", text: String = ""): Boolean

(2) 常用的intent

行為 方式
打電話 makeCall(number: String): Boolean
發(fā)短信 sendSMS(number: String, text: String = ""): Boolean
調(diào)用瀏覽器 browse(url: String, newTask: Boolean = false): Boolean
分享文字 share(text: String, subject: String = ""): Boolean
發(fā)郵件 email(email: String, subject: String = "", text: String = ""): Boolean

6. log
(1) 不想輸入tag的時候,我們可以這樣,默認tag為類名

class MainActivity : Activity() , AnkoLogger {
    fun method(){
        debug(123)
        debug { "debug{}" }
        warn(null)
        info("information")
    }
}

當然也可以自定義tag內(nèi)容,只要重寫loggerTag方法即可。

  override val loggerTag: String
        get() = "myTag"

也許有人發(fā)現(xiàn)debug打印不出來,因為

Note that the log message will not be written if the current log level is above [Log.DEBUG].The default log level is [Log.INFO].

也就是說默認的等級是Log.INFO,而我們只能打印不低于默認等級的log信息,也就是當Log.isLoggable(tag, Log.INFO)為true的時候才可以打印。
至于如何更改默認等級,官網(wǎng)沒寫,也沒有查出來,如果你知道,請給我說一下,謝謝O(∩_∩)O~。
(2) 也可以作為一個對象使用

    private val LOG = AnkoLogger("myTag")
    private var ankoLogger = AnkoLogger(this.javaClass)
    fun method(){
        ankoLogger.warn { "warn use default tag" }
        LOG.warn { "warn use myTag" }
    }

7. color 透明度改變,增加可讀性

        t1.setBackgroundColor(0x99.gray.opaque)//無透明度
        t2.setBackgroundColor(0xff0000.opaque.opaque) //無透明度
        t3.setBackgroundColor(0x99.gray.withAlpha(155))  //設(shè)置透明度

8. dimensions 支持各種px dp sp等的轉(zhuǎn)換,再也不用自己寫了,贊一個

        var px=dip(1)
        var dp = px2dip(px)

9. 更改子view

//更改alert布局中的textview的textSize
  alert {
            customView {
                val  view = View.inflate(this@MainActivity,R.layout.activity_other,null)
                view.applyRecursively {
                    view -> when(view){
                    is TextView -> view.textSize=20f
                }
                }
                addView(view,ViewGroup.LayoutParams(100,100))
            }
        }.show()

三、異步請求數(shù)據(jù)

請求數(shù)據(jù)之前,莫要忘記權(quán)限哦?。?!

class MainActivity : Activity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        val url = "https://facebook.github.io/react-native/movies.json"
        doAsync {
            val data = getData(url)
            uiThread {
                showData(data)
            }
        }
    }

    fun showData(data: String) {
        find<TextView>(R.id.t1).text = data
    }

    fun getData(url: String): String {
        return URL(url).readText()
    }
}

這樣子,數(shù)據(jù)便請求下來了。
uiThread可以依賴調(diào)用者,例如這里被Activity調(diào)用的,如果activity被銷毀了,那么uiThread就不會執(zhí)行,這樣就不會出現(xiàn)Activity銷毀的時候遇到崩潰的情況了。
如果我們想要返回結(jié)果,可以這樣子

  val doAsyncResult = doAsyncResult{
            getData(url)
 }
showData(doAsyncResult.get().toString())

后記

在doAsync源碼中,

    val context = AnkoAsyncContext(WeakReference(this))

可以看到這里使用了弱引用,使用強引用可能會引發(fā)內(nèi)存泄漏的問題。強引用、弱引用、軟引用、虛引用的區(qū)別與介紹點擊鏈接:
強引用、弱引用、軟引用、虛引用

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,936評論 25 709
  • Google在今年的IO大會上宣布,將Android開發(fā)的官方語言更換為Kotlin,作為跟著Google玩兒An...
    藍灰_q閱讀 77,186評論 31 489
  • Kotlin我們也學(xué)了一些基礎(chǔ),但怎么用我們還是不知道?今天我們從基礎(chǔ)轉(zhuǎn)向?qū)崙?zhàn),在Android平臺上開發(fā)Kotl...
    Lypop閱讀 11,132評論 2 6
  • 5. 最佳實踐 好了終于要點講自己的東西了,有點小激動。下面這些僅表示個人觀點,非一定之規(guī),各位看官按需取用,有說...
    SnowDragonYY閱讀 2,489評論 4 36
  • fiddler札記 fiddler的簡單配置 fiddler的界面簡介 fiddler的狀態(tài)圖標
    小矮人Ethan閱讀 267評論 0 0

友情鏈接更多精彩內(nèi)容