Android開發-ButterKnife的導入與使用
ButterKnife介紹
ButterKnife,俗稱黃油刀,在Android開發經常使用的一個專注於Android系統的View注入框架,簡短findViewById來獲取View對象的代碼長度是它的功能之一,此外它還可以縮減監聽事件的長度,並對其性能影響不大,但編譯時間會有所加長,不過你是感受不出來的
GitHub地址:https://github.com/JakeWharton/butterknife
官方文檔:http://jakewharton.github.io/butterknife/
ButterKnife原理
ButterKnife主要採用編譯時註解,就是用 apt 生成代碼,詳細解釋:ButterKnife 原理
ButterKnife 依賴添加
這裏我們介紹在Java中添加ButterKnife依賴和在kotlin中添加ButterKnife依賴,適用於Android X庫
Java中添加依賴
在你的build.gradle(module:app)中的dependencies{ }裏添加如下兩條語句:
//引入ButterKnife
implementation "com.jakewharton:butterknife:10.0.0"
annotationProcessor 'com.jakewharton:butterknife-compiler:10.2.1'
kotlin中添加依賴
同樣在如上相同的文件中,加入以下兩條語句
implementation 'com.jakewharton:butterknife:10.2.1'
kapt 'com.jakewharton:butterknife-compiler:10.2.1'
ButterKnife 插件的安裝
打開Android studio,點擊File 》》Settings》》Plugins》》Marketplace中搜索ButterKnife
點擊安裝後,需要重啓Android studio,纔會啓用
ButterKnife 插件的使用
首先在你的資源文件中設置ID
android:id="@+id/id"
然後在activity中引用該資源文件
setContentView(R.layout.activity_main);
將光標放在綁定視圖的括號中,右鍵如圖操作:
勾選onclick,還可以自動生成點擊事件
@OnClick({R.id.main_page_container, R.id.main_bottn})
public void onViewClicked(View view) {
switch (view.getId()) {
case R.id.main_page_container:
break;
case R.id.main_bottn:
break;
}
}
ButterKnife在不同場景中綁定
Activity裏在onCreate方法中加入ButterKnife.bind(this)
public class MainActivity extends AppCompatActivity{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//綁定初始化ButterKnife
ButterKnife.bind(this);
}
}
Fragment中先使用inflater返回一個view,再使用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();
}
}
Adapter的ViewHolder中使用,將ViewHolder加一個構造方法,在new ViewHolder的時候把view傳遞進去。使用ButterKnife.bind(this, view)進行綁定,代碼如下:
public class MyAdapter extends BaseAdapter {
@Override
public View getView(int position, View view, ViewGroup parent) {
ViewHolder holder;
if (view != null) {
holder = (ViewHolder) view.getTag();
} else {
view = inflater.inflate(R.layout.testlayout, parent, false);
holder = new ViewHolder(view);
view.setTag(holder);
}
holder.name.setText("Donkor");
holder.job.setText("Android");
// etc...
return view;
}
static class ViewHolder {
@BindView(R.id.title) TextView name;
@BindView(R.id.job) TextView job;
public ViewHolder(View view) {
ButterKnife.bind(this, view);
}
}
}
ButterKnife的基本使用
綁定VIEW
單個控件id註解
@BindView(R.id.main_bottn)
BottomNavigationView mbottomNavigationView;
佈局內多個控件id註解
public class MainActivity extends AppCompatActivity {
@BindViews({ R.id.button1, R.id.button2, R.id.button3})
public List<Button> buttonList ;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
buttonList.get( 0 ).setText( "hello 1 ");
buttonList.get( 1 ).setText( "hello 2 ");
buttonList.get( 2 ).setText( "hello 3 ");
}
}
綁定資源
綁定圖片資源爲Bitmap:
@BindBitmap( R.mipmap.wifi )
Bitmap bitmap;
綁定一個String 資源爲一個String變量及數組
綁定string裏面array數組:
```java
<resources>
<string name="app_name">城市</string>
<string-array name="city">
<item>北京市</item>
<item>天津市</item>
<item>哈爾濱市</item>
<item>大連市</item>
<item>香港市</item>
</string-array>
</resources>
------------------------------------------------------------------------------
public class MainActivity extends AppCompatActivity {
@BindView(R2.id.button) //綁定button 控件
public Button button ;
@BindString(R2.string.app_name) //綁定資源文件中string字符串
String str;
@BindArray(R2.array.city) //綁定string裏面array數組
String [] citys ;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//綁定activity
ButterKnife.bind( this ) ;
button.setText(citys[0]);
}
}
綁定color 資源爲一個int變量:
@BindColor(R.color.colorAccent)
int black;
綁定Dimen資源:
@BindDimen(R.dimen.borth_width)
int mBorderWidth;
綁定Drawable
@BindDrawable(R.drawable.test_pic)
Drawable mTestPic;
綁定不同類型的資源
綁定Int類型
@BindInt(R.int.columns)
int columns;
綁定Bool類型
@BindBool(R.bool.is_tablet)
boolean isTablet;
綁定Float類型
// 可綁定 float 類型的 dimen 資源
@BindFloat(R.dimen.image_ratio)
float imageRatio;
綁定事件
綁定點擊事件
綁定單個OnClick和OnLongClick事件
public class MainActivity extends AppCompatActivity {
@OnClick(R.id.button1)
public void onViewClicked() {
Toast.makeText(this, "這是綁定的點擊事件", Toast.LENGTH_SHORT).show();
}
@OnLongClick( R1.id.button1 ) //給 button1 設置一個長按事件
public boolean onViewClickeds(){
Toast.makeText(this, "這是綁定的長按事件", Toast.LENGTH_SHORT).show();
return true ;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//綁定activity
ButterKnife.bind( this ) ;
}
}
綁定多個點擊事件
@OnClick({R.id.button1, R.id.main_button2})
public void onViewClicked(View view) {
switch (view.getId()) {
case R.id.button1:
break;
case R.id.main_button2:
break;
}
}
綁定選擇事件
在RadioGroup+RadioButton中使用OnCheckedChanged事件綁定
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<RadioGroup
android:id="@+id/rg_main"
android:layout_width="fill_parent"
android:layout_height="48dp"
android:layout_alignParentBottom="true"
android:background="@color/white"
android:orientation="horizontal">
<RadioButton
android:id="@+id/rg_home"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:focusable="false"
android:text="@string/nav_one" />
<RadioButton
android:id="@+id/rg_wealth"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:focusable="false"
android:text="@string/nav_two" />
<RadioButton
android:id="@+id/rg_account"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:focusable="false"
android:text="@string/nav_four" />
</RadioGroup>
</LinearLayout>
-------------------------------------------------------------------------
@OnCheckedChanged({R.id.rg_home,R.id.rg_wealth,R.id.rg_account})
public void OnCheckedChangeListener(CompoundButton view, boolean ischanged ){
switch (view.getId()) {
case R.id.rg_home:
if (ischanged){//注意:這裏一定要有這個判斷,只有對應該id的按鈕被點擊了,ischanged狀態發生改變,纔會執行下面的內容
//這裏寫你的按鈕變化狀態的UI及相關邏輯
}
break;
case R.id.rg_wealth:
if (ischanged) {
//這裏寫你的按鈕變化狀態的UI及相關邏輯
}
break;
case R.id.rg_account:
if (ischanged) {
//這裏寫你的按鈕變化狀態的UI及相關邏輯
}
break;
default:
break;
}
}
綁定頁面改變事件
這個在viewpager中使用
@OnPageChange(R.id.viewpager)
public void onPageSelected(int position) {
switch (position) {
case 0:
break;
case 1:
break;
}
}
其他事件
註解 | 用處 |
---|---|
@OnEditorAction | 軟鍵盤的功能鍵 |
@OnFocusChange | 焦點改變 |
@OnItemClick item | 被點擊(注意這裏有坑,如果item裏面有Button等這些有點擊的控件事件的,需要設置這些控件屬性focusable爲false) |
@OnItemLongClick item | 長按(返回真可以攔截onItemClick) |
@OnItemSelected | item被選擇事件 |
@OnTextChanged | EditText裏面的文本變化事件 |
@Optional | 選擇性注入,如果當前對象不存在,就會拋出一個異常,爲了壓制這個異常,可以在變量或者方法上加入一下註解,讓注入變成選擇性的,如果目標View存在,則注入, 不存在,則什麼事情都不做 |
借鑑
Android Butterknife(黃油刀) 使用方法總結
ButterKnife使用方法詳解
ButterKnife 的簡單使用