【ButterKnife】ButterKnife使用詳解及注意事項【1】

一.配置

dependencies { 
    implementation 'com.jakewharton:butterknife:8.2.1'
    annotationProcessor 'com.jakewharton:butterknife-compiler:8.2.1' 
}

二.注意事項

1.在Activity中綁定,必須在setContentView()之後綁定,且父類綁定後,子類不需要再綁定。

2.在Fragment,ViewHold中綁定 ButterKnife.bind(this,view);這裏的this不能替換成getActivity()。

3.在Fragment中必須在onDestroyView()中做解綁操作。

4.使用ButterKnife修飾的方法和控件,不能用private or static 修飾,否則會報錯。

5.setContentView()不能通過註解實現。(其他的有些註解框架可以)。

6.在異步請求中,我們常常會更新UI,這個時候如果頁面銷燬了,ButterKnife也解綁了,那麼就會報空指針異常, 所以必須在異步回調裏來判斷是否已經解綁;方法是在unbind()之後將mUnbinder=null 在異步回調時,首先判斷mUnbinder是否爲null

三.使用方法

1.Activity中使用

public abstract class BaseActivity extends AppCompatActivity {
    protected BaseActivity mActivity;
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mActivity = this;
        if (getSupportActionBar() != null) {
            getSupportActionBar().hide();
        }
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
         initLayout();
        ButterKnife.bind(mActivity);
        initData();
        initView();
    }
    protected abstract void initLayout();
    protected abstract void initData();
    protected abstract void initView();
}
PS:由於每次都要在Activity中的onCreate綁定,所以個人建議寫一個基類完成綁定,子類繼承即可

2.Fragment中使用

public class MineFragment extends BaseFragment {
    private Unbinder unbinder;
    @Override public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState) { 
       View view = Utils.getInflater().inflate(R.layout.fragment_mine, null);  
       unbinder=ButterKnife.bind(this, view); 
       return view; 
    }

    @Override public void onDestroyView() { 
        if (unbinder != null) { 
          unbinder.unbind(); 
          unbinder = null; 
        } 
        super.onDestroyView(); 
     } 
}

3.ViewHolder中使用

public static class ViewHolder {
    @BindView(R.id.item_head_gallery_img) 
    ImageView mHeadGalleryIv; 
    
    ViewHolder(View view) { 
        ButterKnife.bind(this, view); 
    }
}

4.監聽器綁定

@OnClick(R.id.submit) 
public void login() {
    // TODO
}
//定義一個特定類型,它將自動轉換
@OnClick(R.id.submit)
public void sayHello(Button button) {
    button.setText("Hello!");
}
//多個View共用同一事件
@OnClick({R.id.profile_image, R.id.tv_user_phone})
public void login() {
    // TODO
}
//自定義View可以綁定自己的監聽,不指定ID
public class FancyButton extends Button {
    @OnClick
    public void onClick() {
        // TODO
    }
}

5.可以綁定一組View到一個List裏

@BindViews({R.id.tv_feed_complex,R.id.tv_feed_fault,R.id.tv_feed_other})
List<TextView> feedViews;

6.資源綁定

@BindColor(R.color.selected)
int selected;
@BindString(R.string.app_name)
String appName;
@BindDrawable(R.drawable.wel1)
Drawable welcomel;
@BindArray(R.array.city)
String[] citys;
PS:資源文件R.array.city
<resources> 
  <string-array name="city">
    <item>北京</item>
    <item>上海</item>
  </string-array>
</resources>

7.可選綁定:

默認情況下,@bind和監聽器綁定都必須有一個目標view,當ButterKnife找不到對應的view時會拋出一個異常。爲了防止這種異常情況的發生,可以在綁定的字段前面使用@Nullable註解,在綁定的方法前面則可使用@Option註解,來表明對應的是一個可選綁定。

@Nullable
@BindView(R.id.iv_home)
ImageView mHomeIv;

@Optional
@OnClick(R.id.ll_mine)
public void mine() {
	//TODO
}

8.其他

ButterKnife也提供了一個findById方法

TextView goWx = ButterKnife.findById(view,R.id.tv_goWX);

好了,本篇文章就這樣啦,存在總結不到位的地方還望指導,感謝^_^

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章