【Android】移除废弃apply plugin: ‘kotlin-android-extensions‘的处理

蒯胜泫
2023-12-01

背景

apply plugin: ‘kotlin-android-extensions’ 该插件已经被废弃掉了
所以在移除该插件之后,相关的代码如:
import kotlinx.android.synthetic.main
也废弃掉了无用了。

解决: 使用view binding的方式

在gradle中添加:

   buildFeatures{
        viewBinding true
    }

可以简单参考如下的代码结构(kt)

import android.content.Context
import android.util.AttributeSet
import android.view.LayoutInflater
import android.view.View
import androidx.constraintlayout.widget.ConstraintLayout
import im.zego.goclass.R
import im.zego.goclass.databinding.LayoutSuperboardSkipPageViewBinding
import im.zego.superboard.ZegoSuperBoardManager
import im.zego.superboard.constant.ZegoSuperBoardError

/**
 * 超级白板的切换页面 视图
 * 主要包含切换超级白板页面,名称,预览组件等等
 */

class SuperboardSkipPageView : ConstraintLayout {

    constructor(context: Context) : super(context)
    constructor(context: Context, attrs: AttributeSet?) : super(context, attrs)
    constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(
        context,
        attrs,
        defStyleAttr
    )

    // 数据绑定
    var view = LayoutInflater.from(context).inflate(R.layout.layout_superboard_skip_page_view, this)
    var binding = LayoutSuperboardSkipPageViewBinding.bind(view)

    // 防止快速点击页面/步数跳转
    var lastClickPageChangeTime = 0L

    init {
        //初始化布局
        initLayout()
    }


    private fun initLayout() {
        // 白板名称
        binding.mainTopWhiteboardName.setOnClickListener {
            // 弹出白板的内容出来
            boardNameClick.onClick(this)
        }
        // 预览按钮
        binding.mainTopPreview.visibility = View.GONE

        binding.mainTopPreview.setOnClickListener {
            val newSelectedState = !binding.mainTopPreview.isSelected
            binding.mainTopPreview.isSelected = newSelectedState

        }

        // 页数
        binding.mainPageIndex.setOnClickListener {
            // 什么都不做,主要是为了避免误触发顶部栏的显示
        }
        
        // 上一页
        binding.mainPagePrev.setOnClickListener {
            if (System.currentTimeMillis() - lastClickPageChangeTime < 500) {
                return@setOnClickListener
            }
            lastClickPageChangeTime = System.currentTimeMillis()
            // 切换到上一页
            ZegoSuperBoardManager.getInstance().superBoardView?.currentSuperBoardSubView?.flipToPrePage {
                (
                        if(it == ZegoSuperBoardError.ZegoSuperBoardSuccess){
                            /** 翻页成功  */
                        }else{
                            /** 翻页失败  */
                        }
                        )
            }
        }
        
        // 下一页
        binding.mainPageNext.setOnClickListener {
            if (System.currentTimeMillis() - lastClickPageChangeTime < 500) {
                return@setOnClickListener
            }
            lastClickPageChangeTime = System.currentTimeMillis()
            ZegoSuperBoardManager.getInstance().superBoardView?.currentSuperBoardSubView?.flipToNextPage {
                (
                        if(it == ZegoSuperBoardError.ZegoSuperBoardSuccess){
                            /** 翻页成功  */
                        }else{
                            /** 翻页失败  */
                        }
                        )
        }
        // Excel 表格页名称
        binding.mainTopSheetName.setOnClickListener {
           // 弹出 sheet的列表信息出来
            sheetNameClick.onClick(this)
        }
    }
    }

    /**
     *  点击回调方法
     */
    private lateinit var boardNameClick : View.OnClickListener
    private lateinit var sheetNameClick : View.OnClickListener
    private lateinit var previewClick : View.OnClickListener

    fun setBoardNameClick(onClick :View.OnClickListener ){
        boardNameClick = onClick
    }
    fun setSheetNameClick(onClick :View.OnClickListener ){
        sheetNameClick = onClick
    }

    fun setPreviewClick(onClick :View.OnClickListener ){
        previewClick = onClick
    }

    /**
     *  设置文件名称
     */
    fun setFileName(name : String ){
        binding.mainTopWhiteboardName.text = name
    }

    fun setSheetName(name : String){
        binding.mainTopSheetName.text = name
    }

    fun setPageIndex(pageString: String){
        binding.mainPageIndex.text = pageString
    }
}

注意

在xml 的root view 必须和该对象所继承的类型要一样,要不view binding 一用到activity构建的时候,直接就崩了。
例如:

Caused by: java.lang.ClassCastException: im.zego.goclass.view.superboard.SuperboardSkipStepView cannot be cast to android.widget.RelativeLayout

原因是xml 是RelativeLayout为root;而SuperboardSkipStepView却继承的是约束布局~这不就崩了吗

 类似资料: