ButterKnife 注解

  • 简介

对一个成员变量使用@BindView注解,并传入一个View ID, ButterKnife 就能够帮你找到对应的View,并自动的进行对象类型转换(将View转换为特定的子类),之后就可以直接操作该View了:
绑定Activity

public class ButterKnifeActivity extends Activity {

    //(2)绑定布局组件
    @BindView(R.id.nameTv)
    protected TextView mNameTv;

    @Override 
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.simple_activity);
        //(1)进行绑定布局,要在 setContentView()函数之后
        ButterKnife.bind(this);
        //(3)下面就可以直接对mNameTv进行操作了:赋值
        mNameTv.setText(“张三”);
    }

}
  • 优势

    在android编程过程中,我们会写大量的布局和点击事件,像初始 view、设置view监听这样简单而重复的操作让人觉得麻烦类,所以可以采用注解的方式去绑定。

    • 强大的View绑定和Click事件处理功能
    • 代码清晰,可读性强
  • 功能
    • 绑定组件


      绑定组件
    • 绑定资源类型文件(/res/value/... 下的各种资源)


      绑定各种资源文件
    • 进行事件的监听


      绑定事件监听
  • 使用方式
    • grade引用方式
  1. Project的build.gradle文件中增加classpath内容:
buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.0.0'
        classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8' //增加这一句
    }
}
allprojects {
    repositories {
        jcenter()
    }
}
task clean(type: Delete) {
    delete rootProject.buildDir
}
  1. 在app的build.gradle中使用
apply plugin: 'com.neenbedankt.android-apt'//增加这一句
dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.4.0'
    compile 'com.jakewharton:butterknife:8.1.0'
    apt 'com.jakewharton:butterknife-compiler:8.1.0'//增加这一句
}
  1. 注意将项目模块的JDK类型设置成1.7,
    • 代码中使用
      • 绑定Activity

         public class ButterKnifeActivity extends Activity {
              //(2)绑定布局组件
              @BindView(R.id.nameTv)
               protected TextView mNameTv; 
        
               @Override 
               public void onCreate(Bundle savedInstanceState) {
                 super.onCreate(savedInstanceState);
                 setContentView(R.layout.simple_activity);
                 //(1)进行绑定布局,要在 setContentView()函数之后
                 ButterKnife.bind(this);
                 //(3)下面就可以直接对mNameTv进行操作赋值了
                 mNameTv.setText(“张三”);
             }
           }
        
      • 绑定Fragment

         public class BaseFragment extends Fragment { 
               //(2)绑定布局组件
              @BindView(R.id.nameTv)
               protected TextView mNameTv; 
        
               @Override 
               public View onCreateView() {
                 mRootView=inflater.inflate(getContentViewId(),
                 container,false);
                 //(1)进行绑定布局,mRootView被创建之后
                 ButterKnife.bind(this, mRootView);//绑定framgent
                 //(3)下面就可以直接对mNameTv进行操作赋值了
                 mNameTv.setText(“张三”);
                 return mRootView;
               }
           }
        
      • 绑定ViewHolder

         public class TestAdapter extends BaseAdapter {
           @Override
           public View getView(int position, View convertView,                ViewGroup parent) {
             ViewHolder holder;
             if (convertView == null) {
                 convertView = LayoutInflater.from(context).inflate(
                 R.layout.layout_list_item, null);
                 holder = new ViewHolder(convertView);
                 convertView.setTag(holder);
              } else {
                 holder = (ViewHolder) convertView.getTag();
              }
             holder.textview.setText("item=====" + position);
             return convertView;
           }
      
           static class ViewHolder {
               @Bind(R.id.hello_world)
               TextView textview;
               public ViewHolder(View view) {
                   ButterKnife.bind(this, view);
               }
      
            }
        }
      
      • 绑定资源
        @BindString(R.string.app_name)
        String appName;//sting
      
        @BindColor(R.color.red)
        int textColor;//颜色
      
        @BindDrawable(R.mipmap.ic_launcher)
        Drawable drawable;//图片
      
        @BindDrawable(R.drawable.selector_image)
        Drawable selector;
      
      • 绑定事件监听
        //直接绑定一个方法
        @OnClick(R.id.submit)
        public void submit(View view) {
          //  TODO submit data to server...
        }
        
        //所有监听方法的参数是可选的
        @OnClick(R.id.submit)
        public void submit() {
          //  TODO submit data to server...
        }
      
        //监听方法的参数是特殊类型的,将自动转换
        @OnClick(R.id.submit)
        public void submit(Button button) {
          //  TODO submit data to server...
        }  
      
        //多个组件监听同一个点击时间,避免重复调用
        @OnClick(R.id.submit1, R.id.submit2, R.id.submit3)
        public void submit(Button button) {
          //  TODO submit data to server...
        }  
      
        //给EditText加addTextChangedListener(即添加多回调方法
          的监听的使用方法),利用指定回调,实现想回调的方法
        @OnTextChanged(value = R.id.mobileEditText, 
            callback = OnTextChanged.Callback.
              BEFORE_TEXT_CHANGED)
        void beforeTextChanged(CharSequence s, int start, 
              int count,  int after) {
        }
      
        @OnTextChanged(value = R.id.mobileEditText, 
            callback = OnTextChanged.Callback.
          TEXT_CHANGED)
        void onTextChanged(CharSequence s, int start, 
            int before, int count) {
        }
      
        @OnTextChanged(value = R.id.mobileEditText, 
              callback = OnTextChanged.Callback.
              AFTER_TEXT_CHANGED)
        void afterTextChanged(Editable s) {
        }
      
      • 对一组View进行绑定
      @Bind({ R.id.first_name, R.id.middle_name, R.id.last_name })
      List nameViews;
      
      • 对一组View进行事件监听
      @ OnClick({ R.id.first_name, R.id.middle_name,                    R.id.last_name })
      List nameViews;
      
  • 使用心得
    • Activity ButterKnife.bind(this);必须在setContentView();之后,且父类bind绑定后,子类不需要再bind
    • Fragment ButterKnife.bind(this, rootView);
    • 被绑定的成员属性不能用private or static 修饰否则会报错
  • 相关学习文章:
    • 该文章深入分析Butterknife原理,解析代码:
        http://www.360doc.com/content/16/0715/17/8279768_575749596.shtml
      

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