美文网首页
在Android中使用ViewBinding

在Android中使用ViewBinding

作者: 伤口不该结疤 | 来源:发表于2021-03-16 18:23 被阅读0次

1、概述

使用ViewBinding后,系统会自动为每一个xml布局文件生成一个绑定类,通过这个绑定类的实例,可以引用布局里面的控件,在编写代码时可以用ViewBinding替代findViewById,让我们编写代码更方便。接下来,将分别介绍如何在Activity、Fragment、RecyclerView的自定义Adapter中使用ViewBinding

2、使用

2.1 打开配置

app/build.gradle中,打开ViewBinding的配置,再点击Sync Now进行同步

viewBinding {
    enabled true
}
在app/build.gradle中,打开ViewBinding的配置

2.2 在Activity中使用

2.2.1 在Activity中添加ViewBinding类

在Activity中可以引用对应布局的ViewBinding类。ViewBinding类是由系统自动生成的,命名规则为:
1、布局文件名称activity_main.xml
2、去掉中间的下划线activitymain
3、变成驼峰命名ActivityMain
4、加上一个Binding,得到ActivityMainBinding

在Activity中添加ViewBinding类

2.2.2 设置绑定类的实例

1 、调用生成的绑定类中包含的静态 inflate() 方法。此操作会创建该绑定类的实例以供 Activity 使用
2、 通过调用 getRoot() 方法获取对根视图的引用
3、 将根视图传递到 setContentView(),使其成为屏幕上的活动视图

public class MainActivity extends AppCompatActivity {
    private ActivityMainBinding binding;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        binding = ActivityMainBinding.inflate(getLayoutInflater());
        setContentView(binding.getRoot());
    }
}

2.2.3 通过绑定类调用控件

在Activity的布局文件activity_main.xml中,有一个id为textView的TextView控件

Activity的布局文件`activity_main.xml`

MainActivity可以通过binding.textView来操作TextView这个控件,代码如下:

public class MainActivity extends AppCompatActivity {
    private ActivityMainBinding binding;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        binding = ActivityMainBinding.inflate(getLayoutInflater());
        setContentView(binding.getRoot());
        binding.textView.setText("Hello ViewBinding");
    }
}

运行效果如下图:

运行效果图

2.3 在Fragment中使用

2.3.1 在Fragment中添加ViewBinding类

在Fragment添加绑定类的方式和在Activity中类似,实现代码如下:


在Fragment中添加ViewBinding类

2.3.2 设置绑定类的实例

在Fragment类的onCreateView()中,进行如下修改:
1、调用生成的绑定类中包含的静态 inflate() 方法
2、通过调用 getRoot() 方法获取对根视图的引用
3、从 onCreateView() 方法返回根视图,使其成为屏幕上的活动视图

对应代码如下:

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

2.3.3 通过绑定类调用控件

Fragment的布局文件 fragment_blank.xml中,有一个id为textView的TextView控件

Fragment的布局文件

在Fragment的onCreateView方法中,可以通过 binding.textView来操作这个控件,代码如下:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    binding = FragmentBlankBinding.inflate(inflater, container, false);
    binding.textView.setText("在Fragment中使用ViewBinding");
    return binding.getRoot();
}

运行效果如下图:

效果图

2.4 在RecyclerView的自定义Adapter中

2.4.1 创建布局文件

1、创建一个RecyclerView的Holder布局文件,布局文件名称为cell.xml,其中只有一个id为item的TextView控件

RecyclerView的Holder布局文件

2、修改Fragment的布局文件,加入RecyclerView


把RecyclerView加入到Fragment的布局文件

2.4.2 自定义RecyclerView的Adapter类,在里面使用ViewBinding

1、修改MyViewHolderonCreateViewHolder方法,加入绑定类

原始代码:

public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    return null;
}

修改后:

public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    binding = CellBinding.inflate(LayoutInflater.from(parent.getContext()));
    return new MyViewHolder(binding);
}

2、修改MyAdapteronCreateViewHolder方法

public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    binding = CellBinding.inflate(LayoutInflater.from(parent.getContext()));
    return new MyViewHolder(binding);
}

3、修改MyAdapteronBindViewHolder方法

@Override
public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
    holder.binding.item.setText("test");
}

4、在Fragment中设置RecyclerViewLinearLayoutManagerAdapter

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    binding = FragmentBlankBinding.inflate(inflater, container, false);
    binding.textView.setText("在Fragment中使用ViewBinding");

    binding.recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
    binding.recyclerView.setAdapter(new MyAdapter());

    return binding.getRoot();
}

运行效果如下图:


运行效果

5、自定义Adapter的完整代码如下:

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {
    private CellBinding binding;

    @NonNull
    @Override
    public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        binding = CellBinding.inflate(LayoutInflater.from(parent.getContext()));
        return new MyViewHolder(binding);
    }

    @Override
    public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
        holder.binding.item.setText("test");
    }

    @Override
    public int getItemCount() {
        return 1;
    }

    static class MyViewHolder extends RecyclerView.ViewHolder {
        private CellBinding binding;

        public MyViewHolder(@NonNull CellBinding itemView) {
            super(itemView.getRoot());
            binding = itemView;
        }
    }
}

相关文章

网友评论

      本文标题:在Android中使用ViewBinding

      本文链接:https://www.haomeiwen.com/subject/rwmdcltx.html