Android - Butterknife

概述

ButterKnife是一个专专注于Android系统的View注入框架,使用ButterKnife对性能基本没有损失,因为ButterKnife用到的注解并不是在运行时反射的,而是在编译的时候生成新的class.

ButterKnife的注册与绑定

1、在Activity中绑定ButterKnife

由于每次都要在Activity中的onCreate绑定Activity,所以个人建议写一个BaesActivity完成绑定,子类继承即可。绑定Activity必须在setContentView之后。使用ButterKnife.bind(this)进行绑定。

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中绑定ButterKnife

Fragment的生命周期不同于activity,在onCreateView中绑定一个Fragment时,在onDestroyView中将视图设置为null。当你调用bind来为你绑定一个Fragment时,ButterKnife会返回一个Unbinder实例,在适当的生命周期(onDestroyView)回调中调用它的unbind方法进行Fragment解绑。

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中绑定ButterKnife

在Adapter的ViewHolder中使用,将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);  
      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的基本使用

1、绑定View

(1)控件id注解:@BindView

@BindView( R2.id.button)  
public Button button;

(2)布局内多个控件id注解:@BindViews

public class MainActivity extends AppCompatActivity {  

    @BindViews({ R2.id.button1, R2.id.button2,  R2.id.button3})  
    public List<Button> buttonList ;  

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

2、绑定资源

(1)绑定string字符串:@BindString

public class MainActivity extends AppCompatActivity {  

    @BindView(R2.id.button) //绑定button 控件  
    public Button button ;  

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

    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_main);  
        //绑定activity  
        ButterKnife.bind( this ) ;  
        button.setText( str );  
    }  
} 

(2)绑定string里面的array数组 @BindArray

<resources>  
    <string name="app_name">城市</string>  

    <string-array name="city">  
        <item>北京市</item>  
        <item>天津市</item>  
        <item>哈尔滨市</item>  
        <item>大连市</item>  
        <item>香港市</item>  
    </string-array>  

</resources>  

------------------------------------------------------------------------------

public class MainActivity  extends AppCompatActivity {  

    @BindView(R2.id.button) //绑定button 控件  
    public Button button ;  

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

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

    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_main);  
        //绑定activity  
        ButterKnife.bind( this ) ;  
        button.setText(citys[0]);  
    }  
}

(3)绑定Bitmap资源 @BindBitmap

public class MainActivity extends AppCompatActivity {  

    @BindView( R2.id.imageView ) //绑定ImageView 控件  
    public ImageView imageView ;  

    @BindBitmap( R2.mipmap.bm)//绑定Bitmap 资源  
    public Bitmap bitmap ;  

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

        //绑定activity  
        ButterKnife.bind( this ) ;  

        imageView.setImageBitmap(bitmap);  
    }  

} 

(4)绑定一个颜色值 @BindColor

public class MainActivity extends AppCompatActivity {  

    @BindView( R2.id.button)  //绑定一个控件  
    public Button button;  

    @BindColor( R2.color.colorAccent ) //具体色值在color文件中  
    int black ;  //绑定一个颜色值  

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

        //绑定activity  
        ButterKnife.bind( this ) ;  

        button.setTextColor(  black );  
    }  
}

3、事件绑定

(1)绑定点击事件

public class MainActivity extends AppCompatActivity {  

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

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

        //绑定activity  
        ButterKnife.bind( this ) ;  
    }  
}

(2)指定多个id绑定事件

public class MainActivity extends AppCompatActivity {  

    //Tip:当涉及绑定多个id事件时,我们可以使用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;  
        }  
    }  

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

        //绑定activity  
        ButterKnife.bind( this ) ;  
    }  
}

通过上面的例子可以看出多条点击事件是没法有用R2的方式,如果一定要使用R2的写法,可以单一逐次写:

public class MainActivity extends AppCompatActivity {    

    @OnClick(R2.id.ll_product_name)    
    public void onViewClicked1(View view) {    
       System.out.print("我是点击事件1");               
    }    
    @OnClick(R2.id.ll_product_lilv)    
    public void onViewClicked2(View view) {    
       System.out.print("我是点击事件2");     
    }   
    @OnClick(R2.id.ll_product_qixian)    
    public void onViewClicked3(View view) {    
       System.out.print("我是点击事件3");               
    }    
    @OnClick(R2.id.ll_product_repayment_methods)    
    public void onViewClicked4(View view) {    
       System.out.print("我是点击事件4");               
    }    

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

        //绑定activity    
        ButterKnife.bind( this ) ;    
    }    
}

(3)自定义View使用绑定事件

不用指定id,直接注解OnClick。

public class MyButton extends Button {  
  @OnClick  
  public void onClick() {}  
} 

猜你喜欢

转载自blog.csdn.net/CHS007chs/article/details/83301583
今日推荐