在上一篇文章:使用Kotlin開發(fā)Android 創(chuàng)建工程與配置 主要是Kotlin相關(guān)的配置宜岛,這一篇主要是Kotlin Android Extensions
Kotlin Android Extensions
我們?cè)谑褂肑ava時(shí),findViewById是比較麻煩的倘待,通過控件的ID來查找控件令漂,當(dāng)然也有第三方框架ButterKnife膝昆,Dagger等來減少findViewById的使用,通過插件自動(dòng)生成叠必,但在使用Kotlin時(shí)荚孵,便不必如此。在app的Gradle下添加
apply plugin: 'kotlin-android-extensions'
使用擴(kuò)展函數(shù)的好處
在Kotlin官方文檔中對(duì)ButterKnife類似的庫是這樣介紹
Being libraries dependent on runtime, they require annotating fields for each View
也就是說類似ButterKnife這類庫纬朝,在運(yùn)行時(shí)处窥,需要對(duì)每一個(gè)控件進(jìn)行注解。而對(duì)于Kotlin玄组, 官方是這樣介紹
The Kotlin Android Extensions plugin allows us to obtain the same experience we have with some of these libraries, without having to add any extra code or shipping any additional runtime.
Kotlin提供類似于這些庫的相同體驗(yàn),但不需要額外的代碼和運(yùn)行時(shí)間谒麦。我自己理解為減少findViewById的使用的同時(shí)俄讹,沒有產(chǎn)生額外的代碼,也不用在運(yùn)行時(shí)對(duì)每個(gè)控件進(jìn)行注解绕德。
第一個(gè)項(xiàng)目 木子餅干
然后在xml文件里給TextView和Button添加一個(gè)Id患膛,直接在MainActivity中
import kotlinx.android.synthetic.main.activity_main.*
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
main_text.text = "木子餅干"
main_button.setOnClickListener {
val intent =Intent(this,RecyclerViewActivity::class.java)
startActivity(intent)
}
}
注意要導(dǎo)包import kotlinx.android.synthetic.main.activity_main.*,一般情況下Android Studio會(huì)自動(dòng)添加這一句耻蛇,格式一般為
import kotlinx.android.synthetic.main.<layout>.*
<layout>為控件所在的布局文件踪蹬,不同于Java 胞此,在聲明一個(gè)變量時(shí),需要在變量前說明類型跃捣,Kotlin 一般使用val 和 var, var聲明的變量是可變的漱牵,val 聲明的變量是不可變的,同時(shí)也省略new關(guān)鍵字疚漆。運(yùn)行如圖
在Adapter中的用法也類似酣胀,在布局文件中給控件添加ID,
在Adapter中直接使用ID
Android Studio也會(huì)導(dǎo)入相應(yīng)的包娶聘,格式一般為
import kotlinx.android.synthetic.main.<layout>.view.*
此處RecyclerVIew的布局文件為recycler_item ,因此這里為
簡(jiǎn)單的列表展示Demo
和新建Java類類似闻镶,新建Kotlin類只要在New的時(shí)候選擇Kotlin File/Class
在小彈框中選擇Class,輸入名稱即可丸升,我這里是RecyclerViewAdapter
不同于平常的Adapter铆农,Kotlin的Adapter可以在類名后直接加入調(diào)用時(shí)要傳入的參數(shù),相當(dāng)于Java類中的Adapter的構(gòu)造函數(shù)狡耻,Viewholder也不需要findViewById墩剖,也是直接使用ID,這里貼出代碼
class RecyclerViewAdapter(val context: Context, val list: List<String>) : RecyclerView.Adapter<RecyclerViewAdapter.RecyclerHolder>() {
override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): RecyclerHolder {
return RecyclerHolder(LayoutInflater.from(context).inflate(R.layout.recylcer_item, parent, false))
}
override fun getItemCount(): Int {
return list.size
}
override fun onBindViewHolder(holder: RecyclerHolder, position: Int) {
val s = list.get(position)
holder.itemView.item_text.text = s
}
class RecyclerHolder(itemView: View?) : RecyclerView.ViewHolder(itemView) {
}
}
在Activity中使用也相對(duì)簡(jiǎn)單酝豪,Kotlin 的for循環(huán)相對(duì)于java也有不同涛碑,不用聲明 i變量,代碼中的孵淘?意思我理解為否蒲障,?=也就是不等于空瘫证,這也是Kotlin相對(duì)于Java的優(yōu)點(diǎn)揉阎,可以避免空指針,缺少背捌?毙籽,AS會(huì)報(bào)錯(cuò)提示,或者可以再null后面添加!!,斷言不為空毡庆。代碼中..表示xx到xx坑赡,也就是一個(gè)范圍
class RecyclerViewActivity : AppCompatActivity() {
var adapter:RecyclerViewAdapter ?= null
// var adapter:RecyclerViewAdapter = null!!
var list =ArrayList<String>()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_recycler_view)
initView()
}
fun initView() {
for (i in 0 ..20){
list.add("木子餅干" + i)
}
recyclerView.layoutManager = LinearLayoutManager(this)
adapter = RecyclerViewAdapter(this,list)
recyclerView.adapter = adapter
}
}
運(yùn)行如圖
代碼地址:KotlinDemo