簡介
ButterKnife是一個專注於Android系統的View注入框架,當一個布局十分復雜時,需要引入執行大量的findViewById代碼來找到View的對象,有了ButterKnife可以很輕松的省去這些步驟。是大神JakeWharton的力作,目前使用很廣。最重要的一點,使用ButterKnife對性能基本沒有損失,因為ButterKnife用到的注解並不是在運行時反射的,而是在編譯的時候生成新的class。項目集成起來也是特別方便,使用起來也是特別簡單。
ButterKnife的優勢
- 強大的View綁定事件和資源文件的綁定
- 使用的便捷性上,剔除了原始綁定時候的復雜性
- 由於大多數的注解都是在編譯期,所以不會影響程序運行的效率
- 代碼清晰,可讀性相對來說要強很多
github 地址: https://github.com/JakeWharton/butterknife
如何使用?
在Android Studio 項目中配置ButterKnife
1.在Project的 build.gradle 中添加如下代碼:
buildscript { repositories { google() jcenter() } dependencies { classpath 'com.android.tools.build:gradle:3.2.1' //添加如下代碼 classpath 'com.jakewharton:butterknife-gradle-plugin:9.0.0-rc2' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } }
2.在App的 build.gradle 中添加如下代碼:
apply plugin: 'com.android.application' apply plugin: 'com.jakewharton.butterknife'//添加這一行 android { compileSdkVersion 28 defaultConfig { applicationId "com.hejun.loader" minSdkVersion 26 targetSdkVersion 28 versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } } dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation 'com.android.support:appcompat-v7:28.0.0' implementation 'com.android.support.constraint:constraint-layout:1.1.3' testImplementation 'junit:junit:4.12' androidTestImplementation 'com.android.support.test:runner:1.0.2' androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' implementation 'com.jakewharton:butterknife:9.0.0-rc2' annotationProcessor 'com.jakewharton:butterknife-compiler:9.0.0-rc2'//添加這一行 }
ButterKnife插件的添加:可以快速綁定
File -> Settings -> Plugins -> 搜索ButterKnife,找到Android ButterKnife Zeleany進行安裝重啟AndroidStudio
插件的使用:在布局資源上右鍵點擊,如下圖
選中需要綁定的view ,點擊confim會自動生成代碼
ButterKnife的注解類型
1.綁定注解,視圖,資源等等
2.綁定事件
注意:在使用Butterknife 是要 綁定Butterknife .如下
1.在activity中綁定
public class MainActivity extends AppCompatActivity{ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //綁定初始化ButterKnife ButterKnife.bind(this); } }
2.在Fragment中綁定
Fragment的生命周期不同於activity。在onCreateView中綁定一個Fragment時,在onDestroyView中將視圖設置為null。當你調用bind來為你綁定一個Fragment時,Butter Knife會返回一個Unbinder的實例。在適當的生命周期(onDestroyView)回調中調用它的unbind方法進行Fragment解綁。使用ButterKnife.bind(this, view)進行綁定。
public class ButterknifeFragment extends Fragment{ private Unbinder unbinder; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment, container, false); //返回一個Unbinder值(進行解綁),注意這里的this不能使用getActivity() unbinder = ButterKnife.bind(this, view); return view; } /** * onDestroyView中進行解綁操作 */ @Override public void onDestroyView() { super.onDestroyView(); unbinder.unbind(); } }
3.在Adapter中綁定
在Adapter的ViewHolder中使用,將ViewHolder加一個構造方法,在new ViewHolder的時候把view傳遞進去。使用ButterKnife.bind(this, view)進行綁定
class Adapter extends BaseAdapter { private Context context; private List<Userbean> users = new ArrayList<>(); public Adapter(Context context) { this.context = context; } public void addUsers(List<Userbean> userList) { users.addAll(userList); notifyDataSetChanged(); } @Override public int getCount() { return users.size(); } @Override public Userbean getItem(int position) { return users.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder viewHolder = null; if (convertView == null) { convertView = LayoutInflater.from(context).inflate(R.layout.item, parent, false); viewHolder = new ViewHolder(convertView); convertView.setTag(viewHolder); } else { viewHolder = (ViewHolder) convertView.getTag(); } Userbean userbean = users.get(position); viewHolder.name.setText(userbean.getName()); viewHolder.password.setText(userbean.getPassword()); return convertView; } class ViewHolder { @BindView(R.id.name) TextView name; @BindView(R.id.password) TextView password; ViewHolder(View view) { ButterKnife.bind(this, view); } } }