1. 程式人生 > >Android 開發學習程序0.27 kotlin使用 和viewbinding的使用

Android 開發學習程序0.27 kotlin使用 和viewbinding的使用

## 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) : RecyclerView.Adapter() { 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.si