ViewBinding的使用.Android、kotlin

ViewBinding的使用

Android获取控件有很多种方法,最基础的findViewById,实用但是麻烦。使用kotlin后应该会接触到插件kotlin-android-extensions,用起来很好用,子需要输入控件id,根据代码自动补全选择相应布局文件引用就可以直接获取到控件,不过因为种种原因这个方法被google废弃掉了,感兴趣的同学可以自行百度。那么就进入今天的主角了ViewBinding,以前我就有看到过不过没有仔细了解,今天闲下来仔细学习了一下,ViewBinding优点很多,下面我们具体介绍使用方法。

引入ViewBinding

ViewBinding使用方法很简单,使用它有两个条件
1.Android studio 3.6.0版本以上
2.gradle3.6.0版本以上
首先在build.gradle配置:


android {
	...
	Features {
        viewBinding true
    }
}

使用ViewBinding后自己的布局文件都会自动生成一个binding,例如xml:activity_layout_main.xml,生成后的binding叫ActivityLayoutMainBinding,以下划线断点成大驼峰形式。可以直接在文件中使用它,使用方法如下

在activity中使用:


    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityLayoutMainBinding.inflate(layoutInflater)
        setContentView(binding.root)
        //通过binding.控件id可以直接获得控件
        binding.textView.text = "哈哈哈哈哈"
        binding.progress.max = 300
    }

下面我们来给binding封装一下,封装到基类BaseActivity中:

abstract class BaseActivity<T : ViewBinding> : AppCompatActivity() {
    lateinit var binding: T
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = inflateBinding()
        setContentView(binding.root)
        initView()
        initData()
    }

    protected abstract fun inflateBinding(): T
    protected abstract fun initView();
    protected abstract fun initData();
}

在使用的时候:

class MainActivity2 : BaseActivity<ActivityKotlinTestBinding>() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding.bv.max = 300f
        binding.bv.bottomText = "模考分数"
        binding.bv.setAnimaion(270f)
        binding.tvConfirm.setOnClickListener {
        }
    }
    
    //XML布局文件名为activity_kotlin_test.xml,自动生成的binding为ActivityKotlinTestBinding 
    override fun inflateBinding(): ActivityKotlinTestBinding {
        return ActivityKotlinTestBinding.inflate(layoutInflater)
    }

    override fun initView() {
    }

    override fun initData() {
    }
}

在fragment中使用(下面介绍封装后的方法):


    var binding: T? = null
    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        binding = inflateBinding()
        return binding?.root
    }

	//由于 Fragment 的存在时间比其视图长,需要在 onDestroyView() 方法中清除对绑定类实例的所有引用
    override fun onDestroyView() {
        super.onDestroyView()
        binding = null
    }
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        initView()
        initData()
    }
    protected abstract fun inflateBinding():T
    protected abstract fun initView()
    protected abstract fun initData()
class TestFragment : BaseFragment<FragmentTestBinding>() {
    override fun inflateBinding(): FragmentTestBinding {
        return FragmentTestBinding.inflate(layoutInflater)
    }

    override fun initView() {
    	binding.textView.setOnClickListener{
    	
    	}
    }

    override fun initData() {
    	binding.textView.text = "hhhhhhhh"
    }
}
上一篇:Flutter项目实战之女装商城------商品分类模块实现之数据模型、model测试、分类Provide、编写一级分类界面、首页分类导航处理、编写二级分类界面


下一篇:Android架构组件--ViewBinding学习