前段時間更新ButterKnife垃帅,被R2給惡心到了漫蛔,所以準備學習一下ViewBinding將ButterKnife替換掉幕袱。
引用
Android-ViewBinding入門
ViewBinding探索
ViewBinding的作用
在大部情況下访得,使用ViewBinding替換findViewById州既。以前如果不使用第三方框架氮凝, 不管怎樣封裝羔巢,使用起來還是很不方便(比如找不到控件、控件ID沖突等問題)
ViewBinding的開啟流程
- 首先更新AS到3.6版本
- 打開module的gradle文件
- 在android函數里面添加如下代碼罩阵,這樣就開啟完成了
android {
...
viewBinding {
enabled = true
}
}
ViewBinding的使用
- 默認情況下布局XML文件都會生成一個 XXXBinding 類
- 如有不需要生成Binding類的竿秆,可在跟布局添加屬性 tools:viewBindingIgnore="true"如:
<LinearLayout
...
tools:viewBindingIgnore="true" >
...
</LinearLayout>
- 添加一個布局文件activity_main.xml,代碼如下:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:id="@+id/tv_content"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
android:textSize="24sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
- 接著就可以在Activity里面進行使用 XXXBinding 類稿壁,該類提供了三個初始化函數
fun inflate(inflater: LayoutInflater): XXXBinding
fun inflate(inflater: LayoutInflater, parent: ViewGroup, attachToParent: boolean): XXXBinding
fun bind(view: View): XXXBinding
- 添加一個ActivityMainActivity.java,代碼如下
public class MainActivity extends AppCompatActivity {
private ActivityMainBinding viewBinding;//ActivityMainBinding就是上面activity_main.xml生成的綁定文件
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//以前是這樣綁定布局文件的
// setContentView(R.layout.activity_main);
//現在是這樣綁定布局文件的
viewBinding = ActivityMainBinding.inflate(getLayoutInflater());
setContentView(viewBinding.getRoot());
//在這里設置一個顯示文件
viewBinding.tvContent.setText("這里是通過ViewBinding設置的文本");
}
}
運行效果:
ViewBinding運行效果
在Fragment在使用ViewBinding
- 先添加一個布局文件fragment_view_binding.xml幽钢,代碼如下:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/tv_content"
android:layout_width="match_parent"
android:layout_height="0dp"
android:gravity="center"
android:text="Hello World!"
android:textSize="24sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_weight="1" />
</androidx.constraintlayout.widget.ConstraintLayout>
- 添加一個Fragment,ViewBindingFragment,代碼如下:
public class ViewBindingFragment extends Fragment {
private FragmentViewBindingBinding binding;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
binding = FragmentViewBindingBinding.inflate(inflater, container, false);
View view = binding.getRoot();
binding.tvContent.setText("這里是在Fragment通過ViewBinding設置的文本");
return view;
}
public static ViewBindingFragment newInstance() {
Bundle args = new Bundle();
ViewBindingFragment fragment = new ViewBindingFragment();
fragment.setArguments(args);
return fragment;
}
@Override
public void onDestroyView() {
super.onDestroyView();
binding = null;
}
}
Fragment中使用注意事項
在Fragment中使用ViewBinding時傅是,要在onDestroyView()方法中把binding的引用移除匪燕,不然會引起內存泄漏;
總結
1.使用起來比較方便喧笔,編譯比較快谎懦,而且是官方推薦的;
2.目前還不支持布局變量和布局表達式溃斋;
3.不支持雙向綁定界拦,所以只適合一些簡單的使用場境;
4.解決了控件空指針的問題