Android的视图绑定

使用kotlin编写Android项目时可以用kotlin合成进行视图绑定,但升级到Android Studio4.1以后,发现项目中不能直接通过控件名称引用视图了,当时还不清楚原因,只是发现gradle文件中没有添加kotlin扩展库,添加kotlin扩展库就可以像原来一样直接引用控件。
今天创建了一个新的Android App,像往常一样在gradle文件中添加了kotlin扩展库。Build时发现Build Output窗口中有一行提示,表示kotlin合成已经被弃用,应该使用JetPack的视图绑定(View Binding)来替代,并给出了相应的网址。考虑到国内打不开developer.android.com这个网址(其实可以用developer.andoid.google.cn代替),还是把步骤写在这里。

  1. 创建新项目后,在gradle(app)文件中加入
android {
        ...
        viewBinding {
            enabled = true
        }
    }
  1. 在每个Activity中声明一个绑定类变量。绑定类是系统自动为Activity布局文件生成的,生成的类名规则是:将 XML 文件的名称转换为驼峰式大小写,并在末尾添加“Binding”一词。比如MainActivity的布局文件为activity_main.xml,绑定类就是ActivityMainBinding。
     private lateinit var binding: ActivityMainBinding

    override fun onCreate(savedInstanceState: Bundle) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        val view = binding.root
        setContentView(view)
    }

然后就可以使用binding.控件名称的方式来引用视图了,如:

binding.textViewName.text = "test"
binding.button.setOnClickListener{
	……
}

在Fragement中使用视图绑定也是差不多的,直接把官网的代码贴到这里:

private var _binding: ResultProfileBinding? = null
    // This property is only valid between onCreateView and
    // onDestroyView.
    private val binding get() = _binding!!

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        _binding = ResultProfileBinding.inflate(inflater, container, false)
        val view = binding.root
        return view
    }

    override fun onDestroyView() {
        super.onDestroyView()
        _binding = null
    }

要注意的是,Fragment 的存在时间比其视图长。请务必在 Fragment 的 onDestroyView() 方法中清除对绑定类实例的所有引用。

上一篇:WPF 非元素类绑定Binding之 RelativeSource 属性


下一篇:WPF Binding 基础