Android注入框架——ButterKine

OverView

ButterKine是一款開(kāi)源的Android視圖的字段和方法綁定快速注解框架,應(yīng)用十分廣泛??梢员苊庵貜?fù)使用findViewById,很大程度上簡(jiǎn)化代碼,提高開(kāi)發(fā)效率。

Android Studio配置

在build.gradle中添加配置,文章是基于8.8.1版本進(jìn)行配置與說(shuō)明的,不同版本之間使用方法稍有差異,具體情況可查看GitHub_ButterKine項(xiàng)目提交記錄與說(shuō)明。

annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'
implementation 'com.jakewharton:butterknife:8.8.1'

在Library projects中的使用方法:

To use Butter Knife in a library, add the plugin to your buildscript:

buildscript {
  repositories {
    mavenCentral()
    google()
   }
  dependencies {
    classpath 'com.jakewharton:butterknife-gradle-plugin:10.1.0'
  }
}

and then apply it in your module:

apply plugin: 'com.android.library'
apply plugin: 'com.jakewharton.butterknife'

Now make sure you use R2 instead of R inside all Butter Knife annotations.

class ExampleActivity extends Activity {
  @BindView(R2.id.user) EditText username;
  @BindView(R2.id.pass) EditText password;
...
}

注冊(cè)與綁定

在Activity中綁定

需要在onCreate中進(jìn)行綁定,每個(gè)Activity都需要進(jìn)行此操作,所以建議在同一基類中實(shí)現(xiàn),其他Activity繼承此基類。

public abstract class BaseActivity extends AppCompatActivity {
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(initLayout());
        
        //在基類中綁定ButterKnife
        ButterKnife.bind(this);
        create();
    }
    /**
     * 返回Activity layout用于綁定View
     * @return Activity layout
     */
    protected abstract int initLayout();
    /**
     * Activity onCreate完成后的回調(diào)
     */
    protected abstract void create();
}

其他Activity繼承此基類:

public class MainActivity extends BaseActivity {
    
    @Override
    protected int initLayout() {
        return R.layout.activity_main;
    }

    @Override
    protected void create() {
        //TODO onCreate完成
    }
}

在Fragment中綁定

與在Activity中綁定類似,不同的是需要在Fragment的onCreateView中進(jìn)行綁定而不是onCreate,而且需要中onDestoryView中進(jìn)行解綁,來(lái)避免內(nèi)存泄漏風(fēng)險(xiǎn)。同樣的我們一般也定義一個(gè)Fragment基類來(lái)實(shí)現(xiàn),其他Fragment繼承此基類。

public abstract class BaseFragment extends Fragment {
    Unbinder unbinder;

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(initLayout(),null);
        //綁定ButterKnife
        unbinder = ButterKnife.bind(this, view);
        return view;
    }

    @Override
    public void onDestroy() {
        super.onDestroy();

        //解綁
        if(unbinder != null){
            unbinder.unbind();
        }
    }
    protected abstract int initLayout();
}

在Adapter中綁定

在Adapter的ViewHolder中進(jìn)行綁定:

public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.ViewHolder> {
    private Context context;
    private List<String> data;

    ...

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        View view = LayoutInflater.from(context).inflate(R.layout.item_recycler_view, viewGroup, false);
        ViewHolder viewHolder = new ViewHolder(view);
        return viewHolder;
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder viewHolder, int i) {
        viewHolder.itemNameTv.setText(data.get(i));
    }

    @Override
    public int getItemCount() {
        return data.size();
    }

    class ViewHolder extends RecyclerView.ViewHolder{
        @BindView(R.id.item_name_tv)
        TextView itemNameTv;

        public ViewHolder(@NonNull View itemView) {
            super(itemView);

            //綁定ButterKnife
            ButterKnife.bind(this,itemView);
        }
    }
}

基本使用

綁定View

綁定單個(gè)View:

//綁定View
@BindView(R.id.bind_btn)
Button BindBtn;

綁定多個(gè)View:

//綁定多個(gè)View成List
@BindViews({R.id.array_btn_1, R.id.array_btn_2, R.id.array_btn_3})
List<Button> btnList;

需要注意的是被綁定的View聲明時(shí)一般不加類型修飾符而且不能是static類型的。

綁定事件

被注解的事件方法不能用private修飾符

@OnClick(R.id.onclick_btn)
protected void onClick() {
    //TODO to do something
}

對(duì)多個(gè)View進(jìn)行事件注解:

//給多個(gè)View綁定事件
@OnClick({R.id.array_btn_1, R.id.array_btn_2, R.id.array_btn_3})
protected void OnArrayClick(View view) {
    switch (view.getId()) {
        case R.id.array_btn_1:
            Toast.makeText(MainActivity.this, "array_btn_1 Button Clicked.", Toast.LENGTH_SHORT).show();
            break;
       case R.id.array_btn_2:
            Toast.makeText(MainActivity.this, "array_btn_2 Button Clicked.", Toast.LENGTH_SHORT).show();
            break;
       case R.id.array_btn_3:
            Toast.makeText(MainActivity.this, "array_btn_3 Button Clicked.", Toast.LENGTH_SHORT).show();
            break;
    }
}

其他注解事件
[站外圖片上傳中...(image-216bd9-1554205481300)]

綁定資源

//綁定字符串
@BindString(R.string.app_name)
String appName;
//綁定數(shù)組
@BindArray(R.array.test_array)
String[] testArray;
//綁定顏色
@BindColor(R.color.colorAccent)
int colorAccent;

其他資源注解方法:

[站外圖片上傳中...(image-fa991e-1554205481300)]

Action、Setter與apply()

ButterKnife提供了Action和Setter接口,來(lái)對(duì)View的行為和屬性進(jìn)行設(shè)置,具體使用方法如下:

//設(shè)置行為
ButterKnife.Action<View> action = new ButterKnife.Action<View>() {
    @Override
    public void apply(@NonNull View view, int index) {
        //為view設(shè)置行為可點(diǎn)擊
        view.setClickable(true);
    }
};
//設(shè)置屬性
ButterKnife.Setter<Button, String> setter = new ButterKnife.Setter<Button, String>() {
    @Override
    public void set(@NonNull Button view, String value, int index) {
        //為view設(shè)置統(tǒng)一屬性value
        view.setText(value);
    }
};
ButterKnife.apply(btnList, action);
ButterKnife.apply(btnList, setter, "aaaa");

ButterKnife的介紹到這就結(jié)束了,當(dāng)然了還有很多內(nèi)容文中是沒(méi)有介紹的如:Butterknife Zelezny插件等,在這就不詳細(xì)講解了,有需要的朋友自行搜索吧。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容