kotlin-android-extensions 插件被廢棄
筆者曾經嘗試寫過一部分的kotlin代碼 主要是項目中一些代碼是kotlin完成的,其中我認為 kotlin的kotlin-android-extensions 插件非常方便,甚至超過了需要插件的butterknife,但谷歌在最近AS4.1后宣布放棄使用kotlin-android-extensions插件,似乎是由於recyclerview的viewholder的原因。再加上butterknife作者似乎也不再更新,所以掌握viewbinding還是很有必要的。
viewbinding使用方式
在模塊的gradle文件中androi結構下添加,注意Android studio版本要在3.6.0以上。
buildFeatures {
viewBinding true
}
AS 4.1之下可能是
viewBinding {
enabled = true
}
activity中使用
private lateinit var binding:ActivityMineBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMineBinding.inflate(layoutInflater)
setContentView(binding.root)
}
同時如果不想生成布局文件的輔助類,在布局文件根布局下添加 tools:viewBindingIgnore="true"
可以防止binding類生成
fragment中使用
class MainFragment : Fragment() {
private var _binding: FragmentMainBinding? = null
private val binding get() = _binding!!
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
_binding = FragmentMainBinding.inflate(inflater, container, false)
return binding.root
}
override fun onDestroyView() {
super.onDestroyView()
_binding = null
}
}
這里需要解釋下,同樣是使用inflate函數,但在ondestroy時需要將binding置空,所以使用 ?來聲明變量va_binding 使它可為空,同時 !! 表示不為空時執行的操作,如為空,可以拋出空異常。
同時其他的kotlin操作符還有 ?. 安全調用操作符,如 val l=b?.length 如b為空時,返回不會報錯,返回空。
?: 變量在是否為空中選擇一個結果
filterNotNull 可空元素集合中過濾出非空元素。
adapter中的簡單使用
class FruitAdapter(val fruitList: List<Fruit>) : RecyclerView.Adapter<FruitAdapter.ViewHolder>() {
inner class ViewHolder(binding: FruitItemBinding) : RecyclerView.ViewHolder(binding.root) {
val fruitImage: ImageView = binding.fruitImage
val fruitName: TextView = binding.fruitName
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val binding = FruitItemBinding.inflate(LayoutInflater.from(parent.context), parent, false)
return ViewHolder(binding)
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val fruit = fruitList[position]
holder.fruitImage.setImageResource(fruit.imageId)
holder.fruitName.text = fruit.name
}
override fun getItemCount() = fruitList.size
}
在使用中可能出現的 Unresolved reference: ActivityMineBinding 問題解決方法:
1 在 buildgradle (app 文件頭添加apply plugin: 'kotlin-kapt'
2 在依賴下添加 kapt 'com.android.databinding:compiler:3.6.1'
其中 compiler后版本號是自己的gradle版本號,在項目gradle中 dependencies 中查看