首先导入依赖:
导入ButterKnife依赖的知道的有两种方法
1、在app目录下的build.gradle文件的dependencies中加入implementation'com.jakewharton:butterknife:butterknife版本’。我加入的是8.8.1。如:implementation'com.jakewharton:butterknife:8.8.1'然后点击界面右上角的“Sync Now”,点击后就会导入相应的包
2、点击界面左上角的File->Project Structure->Dependencies->Librarydependency或者鼠标点下app再点右键->OpenModule Settings->Dependencies->Library dependency然后在输入框中输入ButterKnife,点击右边的搜索图标.选择com.jakewharton:butterknife:版本号,不要选错了,选错的话接下来的步奏会报错的。然后也会在app目录下的build.gradle文件的dependencies中加入implementation'com.jakewharton:butterknife:butterknife版本’
ButterKnife的注册与绑定:
在Activity 类中绑定:ButterKnife.bind(this);必须在setContentView();之后绑定;且父类bind绑定后,子类不需要再bind。
例:
Activity:
publicclass MainActivity extends AppCompatActivity {
@BindView(R.id.text)
TextView textView;
@Override
protected void onCreate(BundlesavedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
textView.setText("qwer");
}
}
activity_main.xml
<?xmlversion="1.0" encoding="utf-8"?>
<android.support.constraint.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/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="HelloWorld!" />
</android.support.constraint.ConstraintLayout>
配置好运行。运行的时候会出错,会报textView 空指针。别急,接下来在app目录下的build.gradle文件的dependencies中加入annotationProcessor 'com.jakewharton:butterknife-compiler:版本号’。我加入的是8.8.1。如:annotationProcessor'com.jakewharton:butterknife-compiler:8.8.1'然后点击界面右上角的“SyncNow”,点击后就会导入相应的包。这时候在运行就不会报空指针问题。
以上配置用一个不完美的地方就是每一个activity想使用butterknife的时候都需要注册与绑定,很繁琐。我们可以创建一个BaseActivity,在这里注册与绑定butterknife(BaseActivity不需要注册到AndroidManifest.xml中),然后让要使用butterknife的activity继承BaseActivity。
BaseActivity:
publicabstract class BaseActivity extends Activity {
@Override
protected void onCreate(@Nullable BundlesavedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(getLayout());
ButterKnife.bind(this);
initView();
}
public abstract int getLayout();
public abstract void initView();
}
BaseActivity是个抽象类,里面定义两个抽象方法getLayout和initView(当然,长两个方法名字可以随意定义。)。getLayout返回的是子activity所对应的xml在R中的id。因为BaseActivity的setContentView()要初始化这个Xml。initView()方法的作用是当子activity创建的时候自动调用的方法。
例:
publicclass MainActivity extends BaseActivity {
@BindView(R.id.move_image)
TextViewmoveImageView;
@Override
publicint getLayout() {
returnR.layout.activity_main;
}
@Override
public void initView() {
moveImageView.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(Viewv) {
RewriteViewActivity.startAction(MainActivity.this);
}
});
}
以上我理解的butterknife的简单实用过程。