Android开发懒人库ButterKnife

作者: cooperise | 来源:发表于2016-09-14 16:07 被阅读323次

    都说程序员都是比较懒的,什么事情都想着让程序自动化帮忙减轻工作量,这个开源库可以让我们从大量的findViewById()和setonclicktListener()解放出来,其对性能的影响微乎其微(查看过Butter Knife的源码,其自定义注解的实现都是限定为RetentionPolicy.CLASS,也就是到编译出.class文件为止有效,在运行时不额外消耗性能,其是通过java注解自动生成java代码的形式来完成工作),其也有一个明显的缺点,那就是代码的可读性差一些,但了解了之后,上手也很快。。。

    转载:推荐一个Android开发懒人库 -- ButterKnife
    官网:Butter Knife

    1. 使用方法(以Android Studio为例)

    打开build.gradle(Module:app),在dependencies中添加

    compile 'com.jakewharton:butterknife:7.0.1'
    

    (ButterKnife7.0以下使用InjectView,ButterKnife7.0使用Bind,ButterKnife8.0使用BindView,亲测ButterKnife8.0以上运行过程会报错,解决方法比较麻烦,这里就拿7.0.1的举例,想要需求8.0解决方法的可以自行寻找)

    2. 解放控件实例化

    • 未使用ButterKnife的写法:
    public class MainActivity extends AppCompatActivity {    
    
         private TextView textView;    
    
         @Override   
         protected void onCreate(Bundle savedInstanceState) {           
             super.onCreate(savedInstanceState);        
             setContentView(R.layout.activity_main);       
             textView = (TextView) findViewById(R.id.textView);         
             textView.setText("Hello ButterKnife");    
         }
    }
    
    • 使用ButterKnife的写法:
    public class MainActivity extends AppCompatActivity {    
    
         @Bind(R.id.textView) TextView textView;  
    
         @Override   
         protected void onCreate(Bundle savedInstanceState) {           
             super.onCreate(savedInstanceState);        
             setContentView(R.layout.activity_main);       
             ButterKnife.bind(this);        
             textView.setText("Hello ButterKnife");    
         }
    }
    

    ps: ButterKnife.bind(this);在一个Activity里只需要执行一次即可,如果是在Fragment或者Adapter,需要多加一个root view参数,如:

    public class FancyFragment extends Fragment {
    
         @Bind(R.id.button) Button button;
    
         @Override View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
             View view = inflater.inflate(R.layout.fancy_fragment, container, false);
             ButterKnife.bind(this, view);
             return view;
         }
         @Override void onDestroyView() {
            super.onDestroyView();
            ButterKnife.reset(this);
         }
    }
    

    3. 解放监听添加

    • 未使用ButterKnife的写法:
    public class MainActivity extends AppCompatActivity {    
    
         private TextView textView;    
    
         @Override    
         protected void onCreate(Bundle savedInstanceState) {         
             super.onCreate(savedInstanceState);        
             setContentView(R.layout.activity_main);        
             textView = (TextView) findViewById(R.id.textView);        
             textView.setOnClickListener(new View.OnClickListener() {            
                 @Override            
                 public void onClick(View v) {                
                     click();            
                 }        
             });
         }    
    
         private void click(){        
             Log.i("textView", "click");
         }
    }
    
    • 使用ButterKnife的写法:
    public class MainActivity extends AppCompatActivity {    
    
         @Override   
         protected void onCreate(Bundle savedInstanceState) {           
             super.onCreate(savedInstanceState);        
             setContentView(R.layout.activity_main);       
             ButterKnife.bind(this); 
         }
    
         @OnClick(R.id.textView)
         private void click(){    
             Log.i("textView", "click");
         }
    }
    

    是不是简洁很多了,还可以批量为多个控件添加为同一个响应函数:

    @OnClick({ R.id.door1, R.id.door2, R.id.door3 })
    public void pickDoor(DoorView door) {
         if (door.hasPrizeBehind()) {
              Toast.makeText(this, "You win!", LENGTH_SHORT).show();
         } else {
             Toast.makeText(this, "Try again", LENGTH_SHORT).show();
         }
     }
    

    还可以用于多方法的listener(Multi-method Listeners)

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

    4. Zelezny插件的使用

    在AndroidStudio->File->Settings->Plugins->搜索Zelezny下载添加就行 ,可以快速生成对应组件的实例对象,不用手动写。使用时,在要导入注解的Activity 或 Fragment 或 ViewHolder的layout资源代码上,右键—>Generate—>Generate ButterKnife Injections,然后就出现如图的选择框。


    哈哈,ButterKnife的介绍暂且到这里了,希望对“懒”程序员有所帮助。

    相关文章

      网友评论

        本文标题:Android开发懒人库ButterKnife

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