Android ButterKnife初识及使用

参考自:https://www.jianshu.com/p/3678aafdabc7

一、简介

  • 定义:ButterKnife是一个专注于Android系统的View注入框架

  • 项目地址:https://github.com/JakeWharton/butterknife

  • 优势:

    • View绑定和Click处理

    • 使用ButterKnife对性能基本没有损失

      • 因为ButterKnife用到的注解并不是在运行时反射的,而是在编译的时候生成新的class
  • 引入依赖:

    • (1)Step one:在Project的 build.gradle 中添加如下代码:

      buildscript { 
          repositories {
              jcenter() 
          } 
          dependencies { 
              classpath 'com.android.tools.build:gradle:2.3.3' 
              classpath 'com.jakewharton:butterknife-gradle-plugin:8.8.1' //添加这一行 
          } 
      }
      
    • (2)Step two:在App的 build.gradle 中添加如下代码:

      apply plugin: 'com.jakewharton.butterknife'
      
    • (3)Step three:dependencies中添加

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

二、使用

1、基本使用
  • (1)Activity中绑定
    • bind() 一定要在setContentView()之后
public class MainActivity extends AppCompatActivity{ 
    @Override 
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main); 
        //绑定初始化ButterKnife 
        ButterKnife.bind(this); 
    }
}
  • (2)在Fragment中绑定
    • 通过 Unbinder 对象进行操作
    • onCreateView()中绑定(unbinder = ButterKnife.bind(this, view)),onDestroy()中解绑(unbinder.unbind()
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(); 
    } 
}

  • (3)在Adapter中绑定
    • 在Adapter的ViewHolder中使用,将ViewHolder加一个构造方法,在new ViewHolder的时候把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); 
        } 
    } 
}
2、详细使用
  • (1)绑定View

    • 单个控件 @BindView()
      @BindView( R2.id.button)  
      public Button button;   
      
    • 多个控件 @BindViews()
      @BindViews({ R2.id.button1, R2.id.button2,  R2.id.button3})  
      public List<Button> buttonList ;  
      
  • (2)绑定资源

    • 绑定字符串 @BindString()

      @BindString(R2.string.app_name)  
      //绑定资源文件中string字符串  
      String str;  
      
    • 绑定字符串里面Array数组 @BindArray()

      <resources> 
          <string-array name="city"> 
              <item>北京市</item> 
              <item>天津市</item> 
              <item>哈尔滨市</item> 
              <item>大连市</item> <item>香港市</item> 
          </string-array> 
      </resources>
      
      @BindArray(R2.array.city)  
      //绑定string里面array数组  
      String [] citys ;  
      
    • 绑定Bitmap资源 @BindBitmap()

      @BindBitmap( R2.mipmap.bm)
      //绑定Bitmap 资源  
      public Bitmap bitmap ;  
      
    • 绑定一个颜色值 @BindColor()

      @BindColor( R2.color.colorAccent ) 
      //绑定一个颜色值  
      int black ;  
      
  • (3)绑定Event

    • 绑定控件点击事件 @OnClick()

      @OnClick(R2.id.button1 )   //给 button1 设置一个点击事件  
      public void showToast(){  
          Toast.makeText(this, "is a click", Toast.LENGTH_SHORT).show();  
      }  
      
      • 监听事件参数转换
      //自定义一个特定类型,它将自动被转换
      
      @OnClick(R.id.submit)  
      public void submit(View view) {  
          // TODO submit data to server...  
      }  
      
      @OnClick(R.id.submit)  
      public void sayHi(Button button) {
          //看括号内参数的变化就明白了  
          button.setText("Hello!");  
      }  
      
    • 绑定控件长按事件 @OnLongClick()

      @OnLongClick( R2.id.button1 ) 
      //给 button1 设置一个长按事件 
      public boolean showToast2(){     
          Toast.makeText(this, "is a long click", Toast.LENGTH_SHORT).show();
          return true; 
      }
      
    • 指定多个id绑定事件

      • 不使用R2绑定,而是用正常的R包
      @OnClick({R.id.ll_product_name, R.id.ll_product_lilv, R.id.ll_product_qixian, R.id.ll_product_repayment_methods}) 
      public void onViewClicked(View view) { 
          switch (view.getId()) { 
              case R.id.ll_product_name: 
                  System.out.print("我是点击事件1"); 
                  break; 
              case R.id.ll_product_lilv:  
                  System.out.print("我是点击事件2");
                  break; 
              case R.id.ll_product_qixian: 
                  System.out.print("我是点击事件3"); 
                  break; 
              case R.id.ll_product_repayment_methods: 
                  System.out.print("我是点击事件4"); 
                  break; 
          }
      }
      
    • 绑定Item项点击事件 @OnItemSelected()

      @OnItemSelected(R.id.my_spiner)//默认callback为ITEM_SELECTED 
      void onItemSelected(int position) { 
          Toast.makeText(this, "position: " + position, 
          Toast.LENGTH_SHORT).show(); 
      }
      

三、注意事项

1、在Activity类中绑定
  • ButterKnife.bind(this);必须在setContentView();之后绑定
  • 父类绑定过之后,子类无需再绑定
  • 在Activity中不需要解绑操作
  • setContentView()不能通过注解实现(有些其他的注解框架可以)
2、在非Activity类中绑定(Fragment,ViewHolder)
  • ButterKnife.bind(this, view);中的this不能换成getActivity();
  • 在Fragment中必须在onDestroyView()中做解绑操作
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值