Jetpack视图绑定ViewBinding

ViewBinding

ViewBinding是Android官方推出的一种用于简化视图绑定的库。它通过在编译时生成一个绑定类,将布局文件中的视图与代码中的视图进行绑定,然后避免了手动findViewById的繁琐进程。

运用ViewBinding可以前进代码的可读性和可维护性,减少了因为视图ID过错而导致的运行时反常。一起,它还可以减少内存泄漏的危险,因为它运用了弱引用来持有视图。

装备启用ViewBinding

要启用ViewBinding,你需求进行以下进程:

  1. 在项目的build.gradle文件中,保证你的Android Gradle插件版别在4.0.0及以上。假设版别低于4.0.0,你需求晋级插件版别。

  2. 在app模块的build.gradle文件中,添加以下插件依托:

android {
    // ...
    viewBinding {
        enabled = true
    }
}

或许

android {
    // ...
    buildFeatures {
      viewBinding true
    } 
}

这样,你就成功启用了ViewBinding,并可以通过binding方针来访问布局中的视图了。

和DataBinding比较

ViewBinding和DataBinding都是Android开发中用于绑定视图和数据的东西,但它们有一些不同之处。

  1. 运用方法:

    • ViewBinding是在编译时生成的,通过生成的绑定类来访问视图,不需求运行时的数据绑定表达式。运用ViewBinding时,需求手动为每个布局文件生成对应的绑定类。
    • DataBinding是在运行时进行数据绑定,通过在布局文件中运用表达式来绑定数据。运用DataBinding时,不需求手动为每个布局文件生成绑定类。
  2. 功用:

    • ViewBinding在功用方面更加轻量级,因为它是在编译时生成的,不需求运行时的数据绑定表达式。
    • DataBinding在功用方面相对较重,因为它需求在运行时解析和实行数据绑定表达式。
  3. 功用:

    • ViewBinding只能用于视图绑定,不能直接绑定数据到视图。
    • DataBinding不只可以绑定视图,还可以直接绑定数据到视图,一起支撑双向绑定。

综上所述,假设只需求简略的视图绑定,可以选择运用ViewBinding,它更加轻量级和高效。假设需求更复杂的数据绑定功用,可以选择运用DataBinding,它支撑双向绑定和直接绑定数据到视图。

ViewBinding的运用

ViewBinding是一种用于在Android开发中绑定视图的库。它可以协助开发者更便当地访问和操作视图,避免了运用findViewById()方法的繁琐进程。

运用ViewBinding的进程如下:

  1. 先编写布局文件,例如:
<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>
  1. 在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!");
}
  1. 运用生成的绑定类方针来访问和操作视图。例如,可以运用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
    }
}
  1. 在 onCreateViewHolder 方法中,运用 ViewBinding.inflate 方法来创立视图绑定方针。需求传入布局文件的 LayoutInflater、父布局和是否将绑定的视图添加到父布局中。

  2. 在 ViewHolder 类中,通过结构函数接收视图绑定方针,并在 bind 方法中设置视图的数据。可以通过视图绑定方针的特点来访问布局文件中的视图。

  3. 在 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特点指定了占位视图的布局文件。

  1. 在你的Activity或Fragment中,运用ViewBinding来绑定ViewStub。首要,在你的类中声明一个ViewBinding的变量:
private lateinit var binding: YourLayoutBinding
  1. 在你的代码中,找到ViewStub并运用inflate()方法来填充布局并获取绑定的实例:
val viewStub = findViewById<ViewStub>(R.id.viewStub)
binding = YourLayoutBinding.inflate(viewStub.layoutInflater, viewStub, false)
viewStub.setOnInflateListener { _, inflated ->
    binding = YourLayoutBinding.bind(inflated)
}
  1. 现在,你可以运用binding变量来访问ViewStub中的视图元素了。例如,你可以运用binding来设置文本或点击工作:
binding.textView.text = "Hello, ViewStub!"
binding.button.setOnClickListener { // 点击工作 }

这样,你就可以在ViewStub中运用ViewBinding了。记得在不需求运用ViewStub时,可以运用setVisibility()方法来隐藏它。

这样,当视图加载完成后,就会触发监听器的回调方法,可以在回调方法中进行相关操作。

总结

总结来说,ViewBinding是一种便当、高效的视图绑定方法,可以减少代码的冗余和过错,并前进开发功率。它是Android开发中的一个很好的东西,值得开发者们去测验和运用。通过运用ViewBinding,可以减少代码量,前进开发功率,并且避免了因为运用findViewById()方法而或许导致的类型转化过错。