美文网首页
ButterKnife 注解

ButterKnife 注解

作者: 使劲挤海绵 | 来源:发表于2017-12-18 12:41 被阅读17次
    • 简介

    对一个成员变量使用@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<TextView> nameViews;
        
        • 对一组View进行事件监听
        @ OnClick({ R.id.first_name, R.id.middle_name,                    R.id.last_name })
        List<TextView> 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 注解

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