zoukankan      html  css  js  c++  java
  • 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<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 中查看

    吾生也有涯,而知也無涯。以有涯隨無涯,殆已
  • 相关阅读:
    分享到微信时如何自定义文字描述和图片
    Book Review: PowerShell 3.0 Advanced Administration Handbook
    ListView setOnItemClickListener无效原因分析
    Android 自定义通用的loadingview
    Android Studio快速开发之道
    Android 轻松实现仿淘宝地区选择
    Android自定义View4——统计图View
    Android打造属于自己的数据库操作类。
    一起来学习android自定义控件3——边缘凹凸的View
    使用Intellij IDEA搭建Ext JsMVC web项目
  • 原文地址:https://www.cnblogs.com/baimiyishu/p/14330383.html
Copyright © 2011-2022 走看看