Jetpack学习-6-Viewbinding使用及简单分析

Jetpack可以帮助开发者减少样板代码,而findviewbyId正是需要减少的样板代码,于是就有了ViewBinding。一开始我细看Jetpack的各个组件我是懵的,里面没有ViewBinding,这不好把它归纳到Jetpack系列中,后面通过底层源码分析,它是Gradle将DataBinding中识图绑定功能单独抽离出来的一个子集,所以也算是Jetpack中的一员。

简单分析

下面是ViewBinding的简单使用,当前使用的Android Gradle Plugin版本为4.1.0及4.2.0

0,当Android Gradle Plugin 版本4.1.0时,项目中有个androidx.databinding:viewbinding:4.1.0@aar的依赖,当AndroidGradlePluginVersion切换到4.2.0时,viewbinding依赖变为androidx.databinding:viewbinding:4.2.0@aar,果然,和databinding有关系,和AndroidGradlePlugin版本也有联系,依赖中有ViewBinding类。Jetpack学习-6-Viewbinding使用及简单分析_第1张图片

ViewBinding源码如下

package androidx.viewbinding;

import android.view.View;
import androidx.annotation.NonNull;

/** A type which binds the views in a layout XML to fields. */
public interface ViewBinding {

    @NonNull
    View getRoot();
}

Viewbinding在Activity上的使用及分析

1,在项目中的gradle中

android{
	 //android4.0之前
     viewBinding{
     	enabled=true
    }

    
     //androidstudio4.0以上
	 buildFeatures {
       	viewBinding true
   	}
}

2, 系统会对每一个布局文件即时默认生成一个Binding类Jetpack学习-6-Viewbinding使用及简单分析_第2张图片

如果不需要对布局文件进行绑定,可在布局根节点中添加下述属性:

tools:viewBindingIgnore="true" >

 3,生成文件的路径在build\generated\data_binding_base_class_source_out\debug\out\com\sun\viewbinding\databinding上,查看布局及生成的文件,并在activity中添加布局

1)xml布局 activity_main5.xml




    

这样,viewbinding在activity上就使用好了。

ViewBinding在Fragment中的使用

import com.sun.viewbinding.databinding.FragmentHelloBinding;

public class HelloFragment extends Fragment {

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
        FragmentHelloBinding binding = FragmentHelloBinding.inflate(inflater, container, false);
        binding.tvFragmentHello.setText("hello,I am hanmeimei in Fragment");
        return binding.getRoot();
    }
}

ViewBinding在Dialog中的使用

public void showDialog() {
        Dialog dialog = new Dialog(this);
        DialogHelloBinding binding = DialogHelloBinding.inflate(dialog.getLayoutInflater());
        dialog.setContentView(binding.getRoot());
        binding.tvDialogHello.setText("你好,我是dialog Poly");
        dialog.show();
    }

ViewBinding在RecycleView+Adapter中的使用

import com.sun.viewbinding.databinding.ItemStudentBinding;

public class StudentAdapter extends RecyclerView.Adapter {


    private ArrayList beans;

    public StudentAdapter(ArrayList beans) {
        this.beans = beans;
    }

    @NonNull
    @Override
    public StudentViewHold onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
       ItemStudentBinding binding= ItemStudentBinding.inflate(LayoutInflater.from(parent.getContext()));

        return new StudentViewHold(binding);
    }

    @Override
    public void onBindViewHolder(@NonNull StudentViewHold holder, int position) {
        Student bean = beans.get(position);
        holder.tv_age.setText("年龄=" + bean.age);
        holder.tv_name.setText("名字=" + bean.name);
    }

    @Override
    public int getItemCount() {
        return beans.size();
    }

    class StudentViewHold extends RecyclerView.ViewHolder{
        TextView tv_name;
        TextView tv_age;

        public StudentViewHold(ItemStudentBinding binding) {
            super(binding.getRoot());
            tv_name=binding.tvName;
            tv_age=binding.tvAge;
        }
    }
}

小结

总得来说,viewbinding是相当简单并且实用的,相比传统的直接findviewbyid省去了类型转换,也保证了控件的空安全,传入解析器就能自动得到view,也能得到根view下的子view,可以有效避免张冠李戴,这一切都是因为Android Gradle Plugin自动对全部的布局文件进行了封装绑定,在java层只需对绑定类进行直接操作即可,Android Gradle Plugin如何生成绑定类后续再深入分析吧。

Android-Jetpack代码位置:github

你可能感兴趣的:(android,jetpack)