Butterknife集成到应用全部方法(完整版)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/gfg156196/article/details/82835210

集成分为了两部分:

①仅仅在App主工程使用:

在App的 build.gradle 中添加如下代码:

dependencies {
  implementation 'com.jakewharton:butterknife:8.8.1'
  annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'
}

②如果在Library projects中使用:

在Project的 build.gradle 中添加如下代码:

buildscript {
  repositories {
    mavenCentral()
   }
  dependencies {
    classpath 'com.jakewharton:butterknife-gradle-plugin:8.8.1'
  }
}

library的build.gradle中添加如下:

apply plugin: 'com.android.library'
apply plugin: 'com.jakewharton.butterknife'

library中使用需要使用R2,如下:

class MainActivity extends Activity {
  @BindView(R2.id.user) 
    EditText username;
  @BindView(R2.id.pass) 
    EditText password;

}

ButterKnife 注意事项:

  • 在Activity 类中绑定 :ButterKnife.bind(this);必须在setContentView();之后绑定;且父类bind绑定后,子类不需要再bind。
  • 在非Activity 类(eg:Fragment、ViewHold)中绑定: ButterKnife.bind(this,view);这里的this不能替换成getActivity()。
  • 在Activity中不需要做解绑操作,在Fragment 中必须在onDestroyView()中做解绑操作。
  • 使用ButterKnife修饰的方法和控件,不能用private or static 修饰,否则会报错。错误: @BindView fields must not be private or static. (com.zyj.wifi.ButterknifeActivity.button1)
  • setContentView()不能通过注解实现。(其他的有些注解框架可以)
  • 使用Activity为根视图绑定任意对象时,如果你使用类似MVC的设计模式你可以在Activity 调用ButterKnife.bind(this, activity),来绑定Controller。
  • 使用ButterKnife.bind(this,view)绑定一个view的子节点字段。如果你在子View的布局里或者自定义view的构造方法里 使用了inflate,你可以立刻调用此方法。或者,从XML inflate来的自定义view类型可以在onFinishInflate回调方法中使用它。

 


在Activity中绑定ButterKnife:

public class MainActivity extends AppCompatActivity{ 
    @Override 
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.activity_main); 
        //绑定初始化ButterKnife 必须在setContentView之后调用
        ButterKnife.bind(this); 
    }
}

在Fragment中绑定ButterKnife:

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(); 

     } 

}

在Adapter中绑定ButterKnife:

将ViewHolder加一个构造方法,在new ViewHolder的时候把view传递进去。使用ButterKnife.bind(this, 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);

            // 将ViewHolder加一个构造方法,在new ViewHolder的时候把view传递进去
            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)进行绑定
            ButterKnife.bind(this, view); 
        } 
    } 
}

ButterKnife的基本使用

/**
* 主App工程使用如下
*/
@BindView(R.id.txt_tips)
TextView mTxtTips;

/**
* library工程使用如下
*/
@BindView( R2.id.button)  
Button button; 


// 就是R和R2的区别,因为library中目前不能调用R文件了。

// 同时绑定多个
@BindViews({ R2.id.button1, R2.id.button2, R2.id.button3}) 
public List<Button> buttonList ; 

//绑定资源文件中string字符串  
@BindString(R2.string.app_name)  
 String str;  

//绑定资源文件中string里面array数组  
@BindArray(R2.array.city)  
 String [] citys ;  

//绑定Bitmap 资源  
@BindBitmap( R2.mipmap.bm)
 public Bitmap bitmap ; 
 
//具体色值在color文件中  
@BindColor( R2.color.colorAccent ) 
 int black; //绑定一个颜色值 


@Override 
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main);

    ButterKnife.bind(this); 

    buttonList.get( 0 ).setText( "hello 1 "); 
    buttonList.get( 1 ).setText( "hello 2 "); 
    buttonList.get( 2 ).setText( "hello 3 "); 

    button.setText( str );
    button.setText(citys[0]);
    imageView.setImageBitmap(bitmap);
    button.setTextColor(black);  

}

@OnClick(R2.id.button1 ) //给 button1 设置一个点击事件 
public void showToast(){ 
    Toast.makeText(this, "is a click", Toast.LENGTH_SHORT).show(); 
} 
@OnLongClick( R2.id.button1 ) //给 button1 设置一个长按事件 
public boolean showToast2(){ 
    Toast.makeText(this, "is a long click", Toast.LENGTH_SHORT).show();
    return true ;
}

// 我们可以使用 Android studio 的 Butterknife 插件zelezny 快速生成

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

更多注解

  • @BindView—->绑定一个view;id为一个view 变量
  • @BindViews —-> 绑定多个view;id为一个view的list变量
  • @BindArray—-> 绑定string里面array数组;@BindArray(R.array.city ) String[] citys ;
  • @BindBitmap—->绑定图片资源为Bitmap;@BindBitmap( R.mipmap.wifi ) Bitmap bitmap;
  • @BindBool —->绑定boolean值
  • @BindColor —->绑定color;@BindColor(R.color.colorAccent) int black;
  • @BindDimen —->绑定Dimen;@BindDimen(R.dimen.borth_width) int mBorderWidth;
  • @BindDrawable —-> 绑定Drawable;@BindDrawable(R.drawable.test_pic) Drawable mTestPic;
  • @BindFloat —->绑定float
  • @BindInt —->绑定int
  • @BindString —->绑定一个String id为一个String变量;@BindString( R.string.app_name ) String meg;

更多事件

  • @OnClick—->点击事件
  • @OnCheckedChanged —->选中,取消选中
  • @OnEditorAction —->软键盘的功能键
  • @OnFocusChange —->焦点改变
  • @OnItemClick item—->被点击(注意这里有坑,如果item里面有Button等这些有点击的控件事件的,需要设置这些控件属性focusable为false)
  • @OnItemLongClick item—->长按(返回真可以拦截onItemClick)
  • @OnItemSelected —->item被选择事件
  • @OnLongClick —->长按事件
  • @OnPageChange —->页面改变事件
  • @OnTextChanged —->EditText里面的文本变化事件
  • @OnTouch —->触摸事件
  • @Optional —->选择性注入,如果当前对象不存在,就会抛出一个异常,为了压制这个异常,可以在变量或者方法上加入一下注解,让注入变成选择性的,如果目标View存在,则注入, 不存在,则什么事情都不做

ButterKnife的代码混淆

-keep class butterknife.** { *; } 
-dontwarn butterknife.internal.** 
-keep class **$$ViewBinder { *; } 

-keepclasseswithmembernames class * {
     @butterknife.* <fields>;
} 
-keepclasseswithmembernames class * {
     @butterknife.* <methods>;
}

Butterknife插件:zelezny

安装完成插件后,会提示重启AS。重启完后,可以写一个布局并且新建一个代码类测试下。

要注意的是,需要将光标移到setContentView(R.layout.acty_login),中的R.layout.acty_login,然后右键Generate就有了。

猜你喜欢

转载自blog.csdn.net/gfg156196/article/details/82835210