浅谈Android ButterKnife框架的使用
一、简介
ButterKnife 是注解中相对简单易懂的很不错的开源框架,是一个 专注于Android系统的View注入框架, 以前总是要写很多findViewById来找到View对象,有了ButterKnife可以很轻松的省去这些步骤。使用ButterKnife对性能基本没有损失,因为ButterKnife用到的注解并不是在运行时反射的,而是在 编译的时候生成新的class 。
Butterknife优点如下:
-
强大的View绑定和Click事件处理功能,简化代码,提升开发效率
-
方便的处理Adapter里的ViewHolder绑定问题
-
运行时不会影响APP效率,使用配置方便
-
代码清晰,可读性强
Butterknife的下载地址:https://github.com/JakeWharton/butterknife
二、使用步骤
实验环境:Android Studio 3.3.2版本、SDK API 26、Butterknife 1.6.0
-
打开Android Studio 的settings,依此进行如下操作
-
在build.gradle 中添加如下两行代码
implementation 'com.jakewharton:butterknife:8.8.1' annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'
-
选中MainActivity中布局文件名称,右键点击生成按钮,如图所示
点击生成,自动注入三个View,并生成CheckBox和Button的点击事件函数,省去了我们查找元素的麻烦。生成后代码如下:
package com.example.butterknife; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.Button; import android.widget.CheckBox; import android.widget.TextView; import butterknife.BindView; import butterknife.ButterKnife; import butterknife.OnClick; public class MainActivity extends AppCompatActivity { @BindView(R.id.tv_butterknife) TextView tvButterknife; @BindView(R.id.cb_butterknife) CheckBox cbButterknife; @BindView(R.id.bt_butterknife) Button btButterknife; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ButterKnife.bind(this); } @OnClick({R.id.cb_butterknife, R.id.bt_butterknife}) public void onViewClicked(View view) { switch (view.getId()) { case R.id.cb_butterknife: break; case R.id.bt_butterknife: break; } } }
-
之后对代码进行进一步的完善,添加点击的实现以及更改TextView的文本显示。
// 利用butterknife 生成点击事件 @OnClick({R.id.cb_butterknife, R.id.bt_butterknife}) public void onViewClicked(View view) { switch (view.getId()) { case R.id.cb_butterknife: Toast.makeText(this, "点击了CheckBox", Toast.LENGTH_SHORT).show(); break; case R.id.bt_butterknife: Toast.makeText(this, "点击了Button", Toast.LENGTH_SHORT).show(); break; } } // 添加初始化函数,处理TextView的显示文本 void initFunction(){ tvButterknife.setText("我爱学习!"); }
三、效果演示
-
TextView的文本更改为“我爱学习”。点击CheckBox,弹出Toast提示
-
点击button按钮,弹出Toast提示。
四、完整代码
package com.example.butterknife;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.TextView;
import android.widget.Toast;
import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;
public class MainActivity extends AppCompatActivity {
// 利用butterknife找到相应的View组件
@BindView(R.id.tv_butterknife)
TextView tvButterknife;
@BindView(R.id.cb_butterknife)
CheckBox cbButterknife;
@BindView(R.id.bt_butterknife)
Button btButterknife;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
initFunction();
}
// 利用butterknife 生成点击事件
@OnClick({R.id.cb_butterknife, R.id.bt_butterknife})
public void onViewClicked(View view) {
switch (view.getId()) {
case R.id.cb_butterknife:
Toast.makeText(this, "点击了CheckBox", Toast.LENGTH_SHORT).show();
break;
case R.id.bt_butterknife:
Toast.makeText(this, "点击了Button", Toast.LENGTH_SHORT).show();
break;
}
}
// 添加初始化函数,处理TextView的显示文本
void initFunction(){
tvButterknife.setText("我爱学习!");
}
}
<?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"
tools:context=".MainActivity"
android:orientation="vertical"
>
<TextView
android:id="@+id/tv_butterknife"
android:textSize="20sp"
android:layout_margin="10dp"
android:text="textview"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<CheckBox
android:id="@+id/cb_butterknife"
android:text="checkbox"
android:textSize="20sp"
android:layout_margin="10dp"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<Button
android:id="@+id/bt_butterknife"
android:textSize="20sp"
android:text="button"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
五、其他常用标签
@BindArray 绑定string里面array数组;@BindArray(R.array.city ) String[] citys ;
@BindBitmap 绑定图片资源为Bitmap;@BindBitmap( R.mipmap.wifi ) Bitmap bitmap;
@BindString 绑定一个String id为一个String变量;@BindString( R.string.app_name ) String meg;
@BindColor 绑定color;@BindColor(R.color.colorAccent) int black;
@BindDimen 绑定Dimen;@BindDimen(R.dimen.borth_width) int mBorderWidth;
@BindDrawable 绑定Drawable;@BindDrawable(R.drawable.test_pic) Drawable mTestPic;
@BindFloat 绑定float
@BindInt 绑定int
@BindBool 绑定boolean值
五、小结
通过实际操作可以发现,butterknife 对app的运行性能基本不会产生影响,但是在编译的时候可能会有编译速度变慢的情况。上面演示的是在activity中使用butterknife,更多的用法可参考官方文档,用法类似。
【参考链接】 :
[ButterKnife使用方法详解] : https://blog.csdn.net/zyw0101/article/details/80399225
[Android Butterknife(黄油刀) 使用方法总结] : https://blog.csdn.net/donkor_/article/details/77879630
[ButterKnife 的简单使用] : https://blog.csdn.net/zhu576558203/article/details/81411231