在Android中使用ViewBinding

1、概述

使用ViewBinding后,系統(tǒng)會自動為每一個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中可以引用對應(yīng)布局的ViewBinding類。ViewBinding類是由系統(tǒng)自動生成的,命名規(guī)則為:
1、布局文件名稱activity_main.xml
2、去掉中間的下劃線activitymain
3、變成駝峰命名ActivityMain
4、加上一個Binding,得到ActivityMainBinding

在Activity中添加ViewBinding類

2.2.2 設(shè)置綁定類的實例

1 、調(diào)用生成的綁定類中包含的靜態(tài) inflate() 方法。此操作會創(chuàng)建該綁定類的實例以供 Activity 使用
2、 通過調(diào)用 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 通過綁定類調(diào)用控件

在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中類似,實現(xiàn)代碼如下:


在Fragment中添加ViewBinding類

2.3.2 設(shè)置綁定類的實例

在Fragment類的onCreateView()中,進行如下修改:
1、調(diào)用生成的綁定類中包含的靜態(tài) inflate() 方法
2、通過調(diào)用 getRoot() 方法獲取對根視圖的引用
3、從 onCreateView() 方法返回根視圖,使其成為屏幕上的活動視圖

對應(yīng)代碼如下:

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

2.3.3 通過綁定類調(diào)用控件

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 創(chuàng)建布局文件

1、創(chuàng)建一個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中設(shè)置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;
        }
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容