ButterKnife注解式框架

ButterKnife框架可以把人们从繁琐的findViewById和setOnClickListener中解放出来,它采用依赖注入的方式,可以通过注解,使layout文件中的View和代码中的对象自动绑定。

ButterKnife注解式框架_第1张图片
ButterKnife

ButterKnife的特点

  • 方便的处理View的绑定和点击事件
  • 方便的处理ListView/RecycleView中ViewHolder的绑定事件
  • 增强代码可读性

ButterKnife的使用

  • 在Acitvity中使用

    • 在onCreate中

        ButterKnife.bind(this)
      
    • 在变量前添加注解 - @Bind(view.id)

        @Bind(R.id.button)
        Button button;
      
    • 添加响应函数

        @onClick(R.id.button)
        public void submit(){
            //TODO
        }
      
  • 在non-activity中使用,例如Fragment

    • 在onCreateView中

        ButterKnife.bind(this,view)
      
    • 在变量前添加注解

        @Bind(R.id.title)
        Button start;
      
    • 完整代码

        public class FancyFragment extends Fragment {
            @Bind(R.id.button1) Button button1;
            @Bind(R.id.button2) Button button2;
      
            @Override 
            public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
                View view = inflater.inflate(R.layout.fancy_fragment, container, false);
                ButterKnife.bind(this, view);
                // TODO Use fields...
                return view;
            }
        }
      
  • 在Viewholder中使用

    • 在ViewHolder的构造函数中

        ButterKnife.bind(this,view)
      
    • 在变量前添加注解

        @Bind(R.id.title)
        TextView title
      
    • 完整代码如下

      static class ViewHolder {
          @Bind(R.id.title) TextView title;
          
          public ViewHolder(View view) {
              ButterKnife.bind(this, view);
          }   
      }
                      
      
  • 资源绑定

通过注解的方式,把资源绑定到对应变量上。需要传入资源的id,并且不同的资源类型要使用不同的注解。

```

class ExampleActivity extends Activity {
@BindString(R.string.title) String title;
@BindDrawable(R.drawable.graphic) Drawable graphic;
@BindColor(R.color.red) int red;
@BindDimen(R.dimen.spacer) Float spacer;
// ...
}
```
通过这种方式,就可以把资源直接赋值给变量,从而不再需要初始化。

  • View列表

可以一次性将多个views绑定到一个List或数组中:

```

@Bind(R.id.first_name,R.id.middle_name,R.id.last_name)
List nameViews;
```
我觉得这个功能一点也不实用。

  • 事件注入

    • 点击事件注入
    @OnClick(R.id.submit)
    public void sayHi(Button button){
    button.setText("Hello");
    }
    参数是可选的,但如果存在,必须是这个控件类或者控件类的父类。
    + ##### 多个控件具有相同的事件
    
    @OnClick({ R.id.door1, R.id.door2, R.id.door3 })
    public void pickDoor(DoorView door) {
    if (door.hasPrizeBehind()) {
    Toast.makeText(this, "You win!", LENGTH_SHORT).show();
    } else {
    Toast.makeText(this, "Try again", LENGTH_SHORT).show();
    }
    }
靠传入函数的参数,判断是是哪个控件触发的事件。参数的类型必须是这些控件的共同父类。
- #### 在Fragment中,由于与Activity的生命周期不同,有时需解绑ButterKnife
    
    ```
@override
public void onDestroyView(){
    super.onDestroyView();
    ButterKnife.unbind(this);
}
  • 重置注入

      ButterKnife.reset(this);

你可能感兴趣的:(ButterKnife注解式框架)