ViewBinding
ViewBinding是Android官方推出的一种用于简化视图绑定的库。它通过在编译时生成一个绑定类,将布局文件中的视图与代码中的视图进行绑定,然后避免了手动findViewById的繁琐进程。
运用ViewBinding可以前进代码的可读性和可维护性,减少了因为视图ID过错而导致的运行时反常。一起,它还可以减少内存泄漏的危险,因为它运用了弱引用来持有视图。
装备启用ViewBinding
要启用ViewBinding,你需求进行以下进程:
-
在项目的build.gradle文件中,保证你的Android Gradle插件版别在4.0.0及以上。假设版别低于4.0.0,你需求晋级插件版别。
-
在app模块的build.gradle文件中,添加以下插件依托:
android {
// ...
viewBinding {
enabled = true
}
}
或许
android {
// ...
buildFeatures {
viewBinding true
}
}
这样,你就成功启用了ViewBinding,并可以通过binding方针来访问布局中的视图了。
和DataBinding比较
ViewBinding和DataBinding都是Android开发中用于绑定视图和数据的东西,但它们有一些不同之处。
-
运用方法:
- ViewBinding是在编译时生成的,通过生成的绑定类来访问视图,不需求运行时的数据绑定表达式。运用ViewBinding时,需求手动为每个布局文件生成对应的绑定类。
- DataBinding是在运行时进行数据绑定,通过在布局文件中运用表达式来绑定数据。运用DataBinding时,不需求手动为每个布局文件生成绑定类。
-
功用:
- ViewBinding在功用方面更加轻量级,因为它是在编译时生成的,不需求运行时的数据绑定表达式。
- DataBinding在功用方面相对较重,因为它需求在运行时解析和实行数据绑定表达式。
-
功用:
- ViewBinding只能用于视图绑定,不能直接绑定数据到视图。
- DataBinding不只可以绑定视图,还可以直接绑定数据到视图,一起支撑双向绑定。
综上所述,假设只需求简略的视图绑定,可以选择运用ViewBinding,它更加轻量级和高效。假设需求更复杂的数据绑定功用,可以选择运用DataBinding,它支撑双向绑定和直接绑定数据到视图。
ViewBinding的运用
ViewBinding是一种用于在Android开发中绑定视图的库。它可以协助开发者更便当地访问和操作视图,避免了运用findViewById()方法的繁琐进程。
运用ViewBinding的进程如下:
- 先编写布局文件,例如:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<!-- 布局内容 -->
<TextView
android:id="@+id/textView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="Hello"/>
</LinearLayout>
- 在Activity或Fragment中运用ViewBinding生成绑定类。例如,在Activity中:
private ActivityMainBinding binding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = ActivityMainBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
// 运用binding方针访问和操作视图
binding.textView.setText("Hello, ViewBinding!");
}
- 运用生成的绑定类方针来访问和操作视图。例如,可以运用binding方针来访问布局中的TextView:
binding.textView.setText("Hello, ViewBinding!");
在Fragment中运用
在Fragment中运用ViewBinding可以便当地绑定布局文件中的视图,避免了运用findViewById的繁琐操作。下面是 在Fragment中生成ViewBinding类的实例,并运用它来访问布局文件中的视图:
class MyFragment : Fragment() {
private var _binding: FragmentLayoutBinding? = null
private val binding get() = _binding!!
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
_binding = FragmentLayoutBinding.inflate(inflater, container, false)
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
// 运用binding访问视图
binding.textView.text = "Hello, ViewBinding!"
}
override fun onDestroyView() {
super.onDestroyView()
_binding = null
}
}
在Adapter中运用
在Adapter类中创立一个内部类ViewHolder,用于保存每个列表项的视图绑定方针。例如:
class MyAdapter(private val dataList: List<Data>) : RecyclerView.Adapter<MyAdapter.ViewHolder>() {
inner class ViewHolder(private val binding: ItemLayoutBinding) : RecyclerView.ViewHolder(binding.root) {
fun bind(data: Data) {
binding.textView.text = data.text
// 绑定其他视图
}
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val binding = ItemLayoutBinding.inflate(LayoutInflater.from(parent.context), parent, false)
return ViewHolder(binding)
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val data = dataList[position]
holder.bind(data)
}
override fun getItemCount(): Int {
return dataList.size
}
}
-
在 onCreateViewHolder 方法中,运用 ViewBinding.inflate 方法来创立视图绑定方针。需求传入布局文件的 LayoutInflater、父布局和是否将绑定的视图添加到父布局中。
-
在 ViewHolder 类中,通过结构函数接收视图绑定方针,并在 bind 方法中设置视图的数据。可以通过视图绑定方针的特点来访问布局文件中的视图。
-
在 onBindViewHolder 方法中,通过调用 bind 方法来绑定数据到视图。
在Dialog中运用
在Dialog的代码中,运用ViewBinding来绑定布局文件中的视图:
public class MyDialog extends Dialog {
private DialogLayoutBinding binding;
public MyDialog(Context context) {
super(context);
binding = DialogLayoutBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 可以通过binding方针来访问布局文件中的视图
binding.textView.setText("Hello World");
}
}
include标签的运用
在运用ViewBinding时,咱们可以通过在布局文件中添加<include>
标签来引入其他布局文件的视图,并在代码中运用ViewBinding来访问这些视图。
首要,在主布局文件中添加<include>
标签,指定要引入的布局文件:
<include
layout="@layout/other_layout"
android:id="@+id/included_layout" />
然后,在代码中运用ViewBinding来访问引入的布局文件中的视图:
val binding = MainLayoutBinding.inflate(layoutInflater)
val includedBinding = IncludedLayoutBinding.bind(binding.includedLayout.root)
// 访问引入布局文件中的视图
includedBinding.textView.text = "Hello World"
留意,IncludedLayoutBinding
是根据引入的布局文件名主动生成的,所以请根据实际情况修正。
ViewStub标签的运用
在Android开发中,ViewStub标签是一个轻量级的视图容器,它可以在需求时延迟加载视图,然后前进运用的功用和内存运用功率。运用ViewStub标签可以将一个占位视图(placeholder)添加到布局中,并在需求时动态地替换为实际的视图。
要运用ViewStub标签,首要需求在XML布局文件中定义ViewStub元素,如下所示:
<ViewStub
android:id="@+id/view_stub"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout="@layout/your_placeholder_layout" />
其间,android:id
特点用于标识ViewStub,android:layout
特点指定了占位视图的布局文件。
- 在你的Activity或Fragment中,运用ViewBinding来绑定ViewStub。首要,在你的类中声明一个ViewBinding的变量:
private lateinit var binding: YourLayoutBinding
- 在你的代码中,找到ViewStub并运用inflate()方法来填充布局并获取绑定的实例:
val viewStub = findViewById<ViewStub>(R.id.viewStub)
binding = YourLayoutBinding.inflate(viewStub.layoutInflater, viewStub, false)
viewStub.setOnInflateListener { _, inflated ->
binding = YourLayoutBinding.bind(inflated)
}
- 现在,你可以运用binding变量来访问ViewStub中的视图元素了。例如,你可以运用binding来设置文本或点击工作:
binding.textView.text = "Hello, ViewStub!"
binding.button.setOnClickListener { // 点击工作 }
这样,你就可以在ViewStub中运用ViewBinding了。记得在不需求运用ViewStub时,可以运用setVisibility()方法来隐藏它。
这样,当视图加载完成后,就会触发监听器的回调方法,可以在回调方法中进行相关操作。
总结
总结来说,ViewBinding是一种便当、高效的视图绑定方法,可以减少代码的冗余和过错,并前进开发功率。它是Android开发中的一个很好的东西,值得开发者们去测验和运用。通过运用ViewBinding,可以减少代码量,前进开发功率,并且避免了因为运用findViewById()方法而或许导致的类型转化过错。