目录
不玩虚的,就三分钟,看完就能学会最基础的ViewBinding如何使用
使用ViewBinding有什么好处呢
与使用 findViewById 相比,视图绑定具有一些很显著的优点:
1.Null 安全
由于视图绑定会创建对视图的直接引用,因此不存在因视图ID无效而引发Null指针异常的风险。此外,如果视图仅出现在布局的某些配置中,则绑定类中包含其引用的字段会使用@Nullable标记。
2.类型安全
每个绑定类中的字段均具有与它们在XML文件中引用的视图相匹配的类型。这意味着不存在发生类转换异常的风险。
相信这两点大家使用 findViewById时是很有感觉的,但是使用视图绑定就不会有这样的问题
一.添加依赖
在模块的build.gradle中添加下面这一串,就是app文件下的build.gradle,不要添加错地方了
直接把 viewBinding和 dataBinding都添加了,省的以后要加麻烦
//视图绑定添加
buildFeatures {
viewBinding = true
dataBinding = true
}
按照这张图里面的三个步骤来
在加入上述配置后Android Studio会自动为每一个布局文件都生成一个对应的Binding类。
比如ActivityMainBinding 或者 FragmentMainBinding 都是叫xxxBinding
二.在Activity中使用ViewBinding
修改布局文件
在这只是做一个示范
在整个布局文件的最外面包一层<layout>
给控件加上id
<?xml version="1.0" encoding="utf-8"?>
<layout>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/main"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:id="@+id/viewbinding"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="使用视图绑定!"
android:textSize="40sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
修改kt文件
不使用视图绑定时,是这样子的,想要拿到每一个控件都要 findViewById一次,很麻烦
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
}
把代码修改成这样就完成了视图绑定
class MainActivity : AppCompatActivity() {
var binding:ActivityMainBinding ?= null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
val view = binding?.root
setContentView(view)
}
}
这样写完要拿到控件就很方便了
class MainActivity : AppCompatActivity() {
var binding:ActivityMainBinding ?= null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
val view = binding?.root
setContentView(view)
//拿到控件,点击事件
binding?.viewbinding?.setOnClickListener(){
Toast.makeText(this@MainActivity,"这是视图绑定",Toast.LENGTH_LONG).show()
}
}
}
效果
通过视图绑定拿到了控件,并实现点击弹出Toast效果
<iframe allowfullscreen="true" data-mediaembed="csdn" frameborder="0" id="i0wDbsND-1721788507938" src="https://live.csdn.net/v/embed/411934"></iframe>ViewBindingaActivity 效果
三.在 Fragment中使用 ViewBinding
在fragment中使用视图绑定,我就在以在使用Bottomnavigation的基础上进行修改。还不会navigation的小伙伴可以去看一下我之前发布的关于Bottomnavigation的文章。
修改布局文件
写布局文件其实和Activity是一样的,要用的控件加上id,在外面包一层<layout>
<?xml version="1.0" encoding="utf-8"?>
<layout>
<androidx.appcompat.widget.LinearLayoutCompat
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
tools:context=".fragment.FragmentA">
<TextView
android:id="@+id/aaa"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="FragmentA"
android:textSize="30sp"/>
</androidx.appcompat.widget.LinearLayoutCompat>
</layout>
修改kt文件
最开始的fragment是这样的
class FragmentA : Fragment() {
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
return inflater.inflate(R.layout.fragment_a, container, false)
}
}
修改成这样就完成了视图绑定
class FragmentA : Fragment() {
var binding:FragmentABinding ?= null
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
binding = FragmentABinding.inflate(inflater,container,false)
return binding?.root
}
}
然后就可以用视图绑定写点击事件
class FragmentA : Fragment() {
var binding:FragmentABinding ?= null
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
binding = FragmentABinding.inflate(inflater,container,false)
//视图绑定拿到控件,点击事件
binding?.aaa?.setOnClickListener(){
Toast.makeText(requireContext(),"这是视图绑定",Toast.LENGTH_LONG).show()
}
return binding?.root
}
}
效果
通过视图绑定拿到控件,实现点击后Toast效果
<iframe allowfullscreen="true" data-mediaembed="csdn" frameborder="0" id="Mzj1zrnf-1721788766938" src="https://live.csdn.net/v/embed/411948"></iframe>ViewBindingFragment 效果
标签:控件,kotlin,绑定,binding,savedInstanceState,视图,ViewBinding From: https://blog.csdn.net/m0_74531507/article/details/140654398