美文网首页
Android注入框架——ButterKine

Android注入框架——ButterKine

作者: 钟小明_ | 来源:发表于2019-04-02 19:45 被阅读0次

    OverView

    ButterKine是一款开源的Android视图的字段和方法绑定快速注解框架,应用十分广泛。可以避免重复使用findViewById,很大程度上简化代码,提高开发效率。

    Android Studio配置

    在build.gradle中添加配置,文章是基于8.8.1版本进行配置与说明的,不同版本之间使用方法稍有差异,具体情况可查看GitHub_ButterKine项目提交记录与说明。

    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;
    ...
    }
    

    注册与绑定

    在Activity中绑定

    需要在onCreate中进行绑定,每个Activity都需要进行此操作,所以建议在同一基类中实现,其他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完成后的回调
         */
        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中进行绑定而不是onCreate,而且需要中onDestoryView中进行解绑,来避免内存泄漏风险。同样的我们一般也定义一个Fragment基类来实现,其他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中进行绑定:

    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

    绑定单个View:

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

    绑定多个View:

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

    需要注意的是被绑定的View声明时一般不加类型修饰符而且不能是static类型的。

    绑定事件

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

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

    对多个View进行事件注解:

    //给多个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;
    //绑定数组
    @BindArray(R.array.test_array)
    String[] testArray;
    //绑定颜色
    @BindColor(R.color.colorAccent)
    int colorAccent;
    

    其他资源注解方法:

    [站外图片上传中...(image-fa991e-1554205481300)]

    Action、Setter与apply()

    ButterKnife提供了Action和Setter接口,来对View的行为和属性进行设置,具体使用方法如下:

    //设置行为
    ButterKnife.Action<View> action = new ButterKnife.Action<View>() {
        @Override
        public void apply(@NonNull View view, int index) {
            //为view设置行为可点击
            view.setClickable(true);
        }
    };
    //设置属性
    ButterKnife.Setter<Button, String> setter = new ButterKnife.Setter<Button, String>() {
        @Override
        public void set(@NonNull Button view, String value, int index) {
            //为view设置统一属性value
            view.setText(value);
        }
    };
    
    ButterKnife.apply(btnList, action);
    ButterKnife.apply(btnList, setter, "aaaa");
    

    ButterKnife的介绍到这就结束了,当然了还有很多内容文中是没有介绍的如:Butterknife Zelezny插件等,在这就不详细讲解了,有需要的朋友自行搜索吧。

    相关文章

      网友评论

          本文标题:Android注入框架——ButterKine

          本文链接:https://www.haomeiwen.com/subject/rgjnbqtx.html