Android框架之依赖注入
ButterKnife
ButterKnife是一个专注于Android系统的View注入框架,本来需要使用findViewById去找到View对象,非常的繁琐麻烦,有了ButterKnife就可以省去一大串的代码,只需要@BindView就可以了,十分简洁。
ButterKnife项目地址
下面就简单介绍一下ButterKnife最常用的方法
第一步:导入BufferKnife包
在build.gradle(:app)的dependencies里添加如下依赖
dependencies {
...
// butterknife
implementation'com.jakewharton:butterknife:10.2.3'
annotationProcessor'com.jakewharton:butterknife-compiler:10.2.3'
}
如果使用的是Kotlin,需要把annotationProcessor
替换为kapt
还要注意的是在build.gradle(:app)的android里是否有下面的代码
android {
...
// Butterknife requires Java 8.
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
Butterknife需要启用Java 8。
添加了依赖包以后一定要Sync Now一下去下载
第二步:绑定控件
@BindView(R.id.text_view_tv)//绑定控件
TextView mTextViewTv;
第三步:绑定Activity
//绑定处理
ButterKnife.bind(this);
总结
总的代码
ButterKnifeActivity.java
/**
* ButterKnife
*/
public class ButterKnifeActivity extends AppCompatActivity {
@BindView(R.id.text_view_tv)//绑定控件
TextView mTextViewTv;
@BindView(R.id.edit_text_edit)
EditText mEditTextEdit;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_butter_knife);
//绑定处理
ButterKnife.bind(this);
}
//点击事件处理
@OnClick(R.id.button_btn)
public void onViewClicked() {
mTextViewTv.setText(mEditTextEdit.getText());
}
}
activity_butter_knife.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
android:gravity="center_horizontal"
android:orientation="vertical">
<TextView
android:id="@+id/text_view_tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="TextView" />
<EditText
android:id="@+id/edit_text_edit"
android:layout_width="150dp"
android:layout_height="50dp"
android:textColor="@color/white"
android:background="#999999"
android:hint="请输入" />
<Button
android:id="@+id/button_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button" />
</LinearLayout>
运行
以上是ButterKnife在Activity里的使用。
ButterKnife在Fragment使用时,由于Fragment的生命周期不同于activity,在onCreateView()中绑定一个Fragment时,需要在onDestroyView()中通过调用Unbinder的unbind方法将对其进行解绑
值得注意的是,在使用BufferKnife的时候,不能用private or static修饰,否则会报错。
Binding
Android Studio稳定版发布了3.6版本支持全新的视图绑定组件View Binding,可以不用使用findViewById啦。
在模块中启用视图绑定之后,系统会为该模块中的每个 XML 布局文件生成一个绑定类。绑定类的实例包含对在相应布局中具有 ID 的所有视图的直接引用。
官方文档
启用View Binding
android {
...
viewBinding {
enabled = true
}
}
如果希望在生成绑定类时忽略某个布局文件,就可以在相应布局文件的根视图中添加
<LinearLayout
...
tools:viewBindingIgnore="true" >
...
</LinearLayout>
使用
系统生成绑定类的名称是:将 XML 文件的名称转换为驼峰式大小写,并在末尾添加“Binding”一词。
比如activity_view_binding.xml生成的类的名称是ActivityViewBindingBinding
在 Activity 中使用视图绑定
/**
* ViewBinding
*/
public class ViewBindingActivity extends AppCompatActivity {
//activity_view_binding生成的类的名称是ActivityViewBindingBinding
private ActivityViewBindingBinding mBinding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_view_binding);
//调用生成的绑定类中包含的静态inflate()方法。此操作会创建该绑定类的实例以供Activity使用
mBinding = ActivityViewBindingBinding.inflate(getLayoutInflater());
//通过调用getRoot()方法获取对根视图的引用
View view = mBinding.getRoot();
//将根视图传递到setContentView(),使其成为屏幕上的活动视图
setContentView(view);
//使用
mBinding.buttonBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mBinding.textViewTv.setText(mBinding.editTextEdit.getText());
}
});
}
}
activity_view_binding.xml布局如前文ButterKnife
在 Fragment 中使用视图绑定
private ResultProfileBinding binding;
@Override
public View onCreateView (LayoutInflater inflater,
ViewGroup container,
Bundle savedInstanceState) {
binding = ResultProfileBinding.inflate(inflater, container, false);
View view = binding.getRoot();
return view;
}
@Override
public void onDestroyView() {
super.onDestroyView();
binding = null;
}
使用都和Activity中一样
Fragment 的存在时间比其视图长。请务必在 Fragment 的 onDestroyView() 方法中清除对绑定类实例的所有引用。