在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 系列的第一篇,之后會有更多功能介紹給大家,一起學習進步!!!
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/258456.html
標籤:其他
