Jetpack 系列之替换代替ButterKnife的全新视图工具 ViewBinding的使用详解

在Android开发中,基于获取布局控件findViewById的问题,有一些框架来避免我们重复无意义的操作。但是随着Android系统的升级,诸如一些ButterKnife之类的流行库也随之停止更新。当然也出现了一些新的方便我们使用的框架,比如Google提供的Jetpack系列中的ViewBinding。

 

配置ViewBinding

ViewBinding的作用非常简单,就是为了避免编写findViewById,并且配置工作也非常简单。如果你的Android studio 版本是在 3.6或者更高那么你就可以使用它。

只需要在你的工程模块的build.gradle中加入以下配置:

 // Android studio 版本是在 3.6 及以上版本
android {
    // 需要 Android Gradle Plugin 3.6.0
    viewBinding {
        enabled = true
    }
}

//Android Studio 版本是在 4.0 及以上版本
android {
    buildFeatures {
        viewBinding true
    }
}

这样准备工作就做完了,就可以在项目中使用了。

 

ViewBinding的使用

对于 ViewBinding 的使用我们从Activity、Fragment、Adapter等方面。

当然ViewBinding 不管在哪里使用都是很简单,当我们配置完成后Android Studio都会自动为我们的每一个布局文件对应的Binding类。而生成Binding类的命名规则是将布局文件按驼峰方式重命名后,再加上Binding作为结尾。

比如说,我们定义了一个activity_main.xml布局,那么与它对应的Binding类就是ActivityMainBinding。

当然,我们有些布局文件不希望生成对应的Binding类,则可以在该布局文件的根元素位置加入如下声明:

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    ...
    tools:viewBindingIgnore="true">
    ...
</LinearLayout>

在 Activity 中使用视图绑定

我们的布局文件如图所示:

<LinearLayout ... >
    <TextView android:id="@+id/name" />
    <ImageView android:cropToPadding="true" />
    <Button android:id="@+id/button"
        android:background="@drawable/rounded_button" />
</LinearLayout>

那么在Activity界面我们只需要获取他的Binding文件就可以正常使用了,如图所示:

    private ActivityMainBinding binding;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        binding = ActivityMainBinding.inflate(getLayoutInflater());
        View view = binding.getRoot();
        setContentView(view);
        binding.name.setText("Hello World!");
        binding.button.setOnClickListener(new View.OnClickListener() {
            
        });
    }

在 Fragment 中使用视图绑定

在fragment模块中使用也是一样,通过获取根据布局文件生成的Binding文件就可以正常使用,如图所示:

    private FragmentMainBinding binding;

    @Override
    public View onCreateView (LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        binding = FragmentMainBinding.inflate(inflater, container, false);
        View view = binding.getRoot();
        return view;
    }

    @Override
    public void onDestroyView() {
        super.onDestroyView();
        binding = null;
    }

在Adapter中使用视图绑定

在Adapter适配器中使用也只需要根据布局文件生成的Binding文件就可以了,只是在ViewHolder 中传值要注意如图所示:

  @Override
    public TokenRecyclerView.RecyclerViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        RecyclerItemAuthMangerBinding  binding = RecyclerItemAuthMangerBinding.inflate(LayoutInflater.from(parent.getContext()) , parent, false);
    
       // View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.recycler_item_auth_manger, parent, false);
        RecyclerViewHolder viewHolder = new RecyclerViewHolder(binding);
        return viewHolder;
    }


    public static class RecyclerViewHolder extends RecyclerView.ViewHolder {
        TextView mTextView;
        //之前的写法
        //public ViewHolder(@NonNull View itemView) {
        //    super(itemView);
        //    mTextView = itemView.findViewById(R.id.tv_include);
        //}

        //使用ViewBinding的写法
        public RecyclerViewHolder (@NonNull RecyclerItemAuthMangerBinding  binding) {
            super(binding.getRoot());
            mTextView = binding.tvInclude;
        }
    }

以上基本上就在开发中可以正常使用了,当然还有一些如引入布局include和merge的特殊使用。

首先是 include布局,我们只需要在include的时候给被引入的布局设置一个id,那么我们在使用的时候就可以直接通过这个ID来调用include布局的控件名称,如图所示:

    // include布局被引用的配置
    <include
        android: id = "@+id/includeid"
        layout = "@layout/includelayout" / >
        
    // 使用时直接通过引用时的命名ID来使用
    binding.includeid.title.text = "Title"
    binding.includeid.button.setOnClickListener {
    } 

然后对于merge布局,这种方式就不是简单的引用了,因为merge是去除一层布局嵌套的,没有一个布局包裹。所以我们要通过把merge布局绑定的方式添加到主体布局中方便我们使用,如图所示:

  ActivityMainBinding binding = ActivityMainBinding.inflate(layoutInflater)
    //把引用的merge布局绑定到引用的布局中去
    TitlebarBinding titlebarBinding = TitlebarBinding.bind(binding.root)
    setContentView(binding.root)
    titlebarBinding.title.text = "Title"
    titlebarBinding.back.setOnClickListener {
    }

这样,关于 ViewBinding 的使用就介绍完了。

这是 Jetpack 系列的第一篇,之后会有更多功能介绍给大家,一起学习进步!!!

 

猜你喜欢

转载自blog.csdn.net/u014571139/article/details/113757720