1. 程式人生 > >讓你可以更簡單地用 Kotlin 開發 Android 應用

讓你可以更簡單地用 Kotlin 開發 Android 應用

anko

anko 是一款結合kotlin語言拋棄佈局xml的工具,使用他就可以不用寫佈局xml程式碼了

舉個栗子

如果我們需要實現一個功能 點選按鈕toast彈出輸入框輸入的字元(如下效果圖)


效果圖

普通方式實現這樣一個功能,可能我們會這麼做

  • 建立佈局xml檔案
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.github.jokar.ankotest.MainActivity">

    <EditText
        android:id="@+id/edit"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:text="showEdit"
        android:onClick="showEdit"/>
</LinearLayout>

  • 在activity裡初始化輸入框和 寫點選事件
class MainActivity : AppCompatActivity() {
    var edit: EditText? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        edit = findViewById(R.id.edit) as EditText
    }


    fun showEdit(v: View) {
        var string = edit?.text.toString()
        Toast.makeText(applicationContext, string, Toast.LENGTH_SHORT).show()
    }
}

但是如果我們使用anko就不同了,我們不需要XML檔案了,然後修改activity如下
class MainActivity : AppCompatActivity() {
    var edit: EditText? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        createView()
    }


    fun showEdit() {
        var string = edit?.text.toString()
        Toast.makeText(applicationContext, string, Toast.LENGTH_SHORT).show()
    }

    fun createView() {
        linearLayout {
            lparams(width = matchParent, height = matchParent)
            orientation = LinearLayout.VERTICAL

            edit = editText {
                textSize = 15f
            }.lparams(width = matchParent, height = wrapContent)

            button {
                text = "ShowText"
                textSize = 15f
                onClick {
                    showEdit()
                }
            }.lparams(width = matchParent, height = wrapContent) {
                topMargin = dip(10)
            }
        }
    }
}


這就是anko的基本用法了,跟寫xml佈局沒有多大區別;但在實際使用過程中會發現如果不是再activity類裡想直接使用anko控制元件是不行的;;下面介紹開發中遇到的基本場景

在fragment裡使用anko

在fragment裡使用還是比較容易的;只需要在最外層加上UI {}.view就可以使用了;樣例如下:

這樣就行了,使用很簡單

class Fragment1 : Fragment() {

    var swipeRefreshLayout: SwipeRefreshLayout? = null
    var recyclerView: RecyclerView? = null

    override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        return super.onCreateView(inflater, container, savedInstanceState)
    }

    /**
     * createView
     */
    fun createView(): View {
        return UI {
            linearLayout {
                //swipeRefreshLayout
                swipeRefreshLayout = swipeRefreshLayout {
                    setColorSchemeResources(android.R.color.holo_blue_bright)
                    setOnRefreshListener {
                        getData()
                    }
                    //recyclerView
                    recyclerView = recyclerView {
                        layoutManager = LinearLayoutManager(context)
                        backgroundColor = Color.parseColor("#f3f3f3")
                    }
                }.lparams(width = matchParent, height = matchParent)

            }
        }.view
    }

    fun getData() {

    }
}


在Adapter裡使用

這裡介紹如何在非activity,fragment裡使用anko,也很簡單使用到了with字元,例如這樣:

fun createItemView(context: Context): View {
        return with(context) {
            linearLayout {
                lparams(width = matchParent, height = wrapContent)
                cardView {
                    linearLayout {
                        id = R.id.percentFrameLayout
                        backgroundResource = selectableItemBackground(context)
                        lparams(width = matchParent, height = dip(80))
                        orientation = LinearLayout.VERTICAL

                        textView {
                            id = R.id.text
                            gravity = Gravity.LEFT
                            textSize = 17f
                            textColor = Color.BLACK
                        }.lparams(width = matchParent, height = matchParent) {
                            setPadding(dip(10), dip(10), dip(10), dip(10))
                        }
                    }
                }.lparams(width = matchParent, height = wrapContent) {
                    margin = dip(5)
                }
            }
        }
    }

    fun selectableItemBackground(context: Context): Int {
        var outValue = TypedValue()
        context.theme.resolveAttribute(android.R.attr.selectableItemBackground, outValue, true)
        return outValue.resourceId
    }


  • 注意這裡給控制元件設定了id,所以你需要在res/value資料夾下建立一個名為ids.xml檔案,然後新增你所需要的id
<?xml version="1.0" encoding="utf-8"?>
<resources>
  <item name="percentFrameLayout" type="id"/>
  <item name="text" type="id"/>
</resources>

然後在adapter裡使用就是這樣:

 override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): ViewHolder {
        return ViewHolder(createItemView(context))
    }

 inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
        var tvTitle = itemView.findViewById(R.id.text) as TextView
    }


引用xml佈局檔案

當然anko也不是那麼死板的工具,他也可以引用xml佈局檔案很簡單;使用include字元就行

include<View>(R.layout.common_toolbar)

就像這樣就可以了

高階用法 - 如何使用自定義view

在實際開發中anko給我們提供的控制元件肯定是不能滿足我們的需求的,那我們怎麼把自己的自定義控制元件使用到anko中呢,其實很簡單

  • 首先建立一個
    Views.kt
    檔案
  • 在該檔案中新增下面程式碼
inline fun ViewManager.customizeView(theme: Int = 0) = customizeView(theme) {}

inline fun ViewManager.customizeView(theme: Int = 0, init: CustomizeView.() -> Unit) = ankoView({ CustomizeView(it) }, theme, init)
      *  這裡的```CustomizeView```是你的自定義View
      *  這裡的```customizeView```是你用在anko裡的名稱,一般就是自定義view的名稱,首字母小寫這樣的寫法
 然後就可以在anko裡這樣使用了customizeView{}

anko的基本使用就到這了,後續若遇到其他問題會補充上的;若 想看anko具體在專案裡使用;可以看看一個使用 kotlin編寫的知乎日報 .

相關推薦

可以簡單 Kotlin 開發 Android 應用

anko anko 是一款結合kotlin語言拋棄佈局xml的工具,使用他就可以不用寫佈局xml程式碼了 舉個栗子 如果我們需要實現一個功能 點選按鈕toast彈出輸入框輸入的字元(如下效果圖) 效果圖 普通方式實現這樣一個功能,可能我們會這麼做 建立佈局xml檔案<

到爆的Kotlin擴充套件庫AndroidKTX,如果Kotlin開發Android,You Need It !

寫在前面 首先,這是一個Kotlin類庫,如果你的專案是JAVA寫的,那就暫時幫不上你的忙了。 其次,這個可不是官方那個android-ktx。 隨著專案越來越多,我們必然抽取大量的工具類和公共模組。Java的工具類看起來已經很簡單了,但是Kotlin的擴充套件又讓其簡潔性和易用性上了一個等級,而且還有點

Kotlin 開發 Android 專案是一種什麼樣的感受?

前言 從初學 Kotlin,到嘗試性的寫一點體驗程式碼,再到實驗性的做一些封裝工作,到最後摸爬滾打著寫了一個專案。不得不說過程中還是遇上了不少的問題,儘管有不少坑是源於我自己的選擇,比如使用了 anko 佈局放棄了 xml,但是總體來說,這門語言帶給我的驚喜是

Kotlin開發android平臺語音識別,語義理解應用(olamisdk)

本文使用Kotlin開發android平臺的一個語音識別方面的應用,用的是尤拉密開放平臺olamisdk。 1.Kotlin簡介 Kotlin是由JetBrains建立的基於JVM的程式語言,IntelliJ正是JetBrains的傑作,而android

使用Kotlin開發Android應用

1、Kotlin介紹 [Kotlin](https://kotlinlang.org/) Kotlin是一門基於JVM的程式語言,它正成長為Android開發中用於替代Java語言的繼承者。Java是世界上使用最多的程式語言之一,當其他程式語言為更加便於開

Golang 開發 Android 應用(六)

用 Golang 開發 Android 應用 -- Camera 使用 計劃按以下的內容更新 Android 中的 Camera Demo 程式碼說明 Camera2

OkRx擴充套件,OkGo完美結合RxJava,比Retrofit簡單

OkGo - Rx擴充套件,可以方便的和RxJava聯用,如果你熟悉Retrofit,那麼這個框架和Retrofit使用方式很像。 以下是該專案相關文章的傳送門: 聯絡方式 如何選擇網路框架 說了這麼多功能,我們來看看為什麼要使用OkGo這個框架。 首先目前主流的幾

嵌入式伺服器jetty,開發web

概述 jetty是什麼? jetty是輕量級的web伺服器和servlet引擎。 它的最大特點是:可以很方便的作為嵌入式伺服器。 它是eclipse的一個開源專案。不用懷疑,就是你常用的那個eclipse。 它是使用Java開發的,所以天然對Java支援良好。 官方網址 什

的程式碼減少三倍!使用kotlin開發Android(五) 監聽器

在前面的部落格中,有一個栗子,是點選按鈕轉跳的監聽器。 button.setOnClickListener { val user = User("name") user.id = "100" SecondActivity.startActivity(this,u

的程式碼量減少3倍!使用kotlin開發Android(三) 縮短五倍的Java Bean

回顧一下 哈,沒想到你已經堅持不懈看到第三篇了,不錯哈~堅持就是勝利。 本文同步自博主的私人部落格wing的地方酒館 在上一篇文章中,我們介紹了擴充套件函式,這裡對上一篇進行一點小小的補充。 還記得textview是如何setText()的嗎 te

github 專案搜尋技巧-高效精準搜尋專案

目錄 github 搜尋技巧 案例 普通搜 搭配技巧搜 限定詞 查詢某個使用者或組織的專案 輔助限定詞 還沒

Vue3構建企業級前端應用,TS能輕鬆點

摘要:Vue 3已經發布有一段時間了,到底有哪些新特性值得關注,如何用它構建企業級前端專案,怎樣快速上手Vue 3?本篇文章將對此進行詳細講解。 前言 工欲善其事,必先利其器 --《論語》 在如今被三大框架支配的前端領域,已經很少有人不知道 Vue 了。2014 年,前 Google 工程師尤雨溪釋出了所謂的

聲音清晰,PR去掉視頻中的噪音

tieba name pen ... 最好 gray false author lis Premiere V7.0沒有支持當前文件類型的輸入源的問題 25 我是新手,把DVD影片放到電腦裏,顯示的是VOB文件,導入類型顯示的是所有支持格式,於是我就點擊了VOB文件,但是說

智能家居入口科普 好了解智能家居

布局 廠商 習慣 轉變 開始 智能路由 管家 創建 解決 自從智能家居這個行業誕生以來,這個入口的問題就一直沒有間斷,入口就是管理智能家居的總和系統,作為智能家居,如果是對每個產品分別執行指令,那肯定就失去了智能家居的意義,這時,一個很好地中控主機就顯得尤為重要。當智能家居

值錢的方法:培養稀缺(追逐新技術,淬煉已有技能、做到出類拔萃,尋找自己所在的行業痛點,App開發者是市場動態平衡的典型)

問題 全面 bin o2o 策略 軟件公司 前瞻 籃球場 rdquo 一個開發者,如何才能更值錢? 答案非常簡單:掌握稀缺資源。 那麽,怎樣才能持續不斷地掌握稀缺資源,讓自己更值錢呢? 請看接下來介紹的 2 種識別稀缺的方法和 2 種培養稀缺的策略。 稀缺資

超級眼好的管理員工

個人 工資 實時監控 等等 裝包 網上 必備 泄露 等你 對於現代企業而言,網絡無疑是一把雙刃劍。何以解憂? 隨著企業信息建設的普及,它是獲得客戶、供應商以及合作夥伴的必備手段和信息的必要來源。但是分散員工精力,降低生產力的根源。 重要資料的泄漏以及不可控的安全隱患使企業面

簡悅瀏覽器:智能插件閱讀簡單愉悅

是我 好玩 pst 時也 分享圖片 實例 決定 link 現在 簡悅瀏覽器 是一款專為iOS手機用戶設計和開發的優化閱讀瀏覽器工具,簡悅瀏覽器通過自主開發的智能轉碼引擎和ACP插件可以無縫將一個普通的網站深度優化,為手機用戶提供賞心悅目的閱讀瀏覽體驗。當用戶使用簡悅瀏覽器訪

如何搜尋引擎理解我們想要什麼

能否有效地利用搜索引擎,對我們能否在海量資訊中迅速挖掘出所需有著決定性影響。 本文的源起是今天讀完的一本谷歌前高管寫的書《 Google 時代的工作方法》,其中一章提到對於關於谷歌搜尋的高效運用,加之先前看過為數不少的關於搜尋引擎運用的文章,結合自己平時的搜尋習慣,出於更好地理解和運用的目的,方有此文。 本

理解五個基本概念,像機器學習專家

大多數人可能對機器學習有點恐懼或困惑。 腦子中會有它到底是什麼,它有什麼發展方向,我現在可以通過它掙錢嗎等等這樣的問題。 這些問題的提出都是有依據的。事實上,你可能沒有意識到自己其實多年來一直在訓練機器學習模型。你看過蘋果手機或者是Facebook上的照片吧? 你知道它如何向你展示一組面孔並要求你識別它

Python Flask構建微信小程式訂餐系統 從專案搭建到部署上線 快速掌握Python全棧開發

本課程是python flask+微信小程式完美結合,從專案搭建到騰訊雲部署上線,打造一個全棧訂餐系統。從基礎語法入手,易於掌握,構建MVC架構,增進對小程式和後端API的理解認識。深入淺出帶你進階全棧工程師課程,幫助你快速提升專案經驗,掌握專案開發技巧,提高專案中解決問題的能力。 --