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