最近注解这个服务器端运用的技术,越来越多的在app的开发中提起,原因很简单,现在app变得越来越庞大了,注解这种方式还是有使用的价值,代码编写可以很方便,整个代码会变的很简洁。现在给大家介绍的注解框架Butter Knife,关于他的介绍http://jakewharton.github.io/butterknife/
Butter Knife主要拿来注解替代findViewById
的操作,实现方式也超级简单
public class MainActivity extends AppCompatActivity {
@Bind(R.id.title)TextView title;
@Bind(R.id.subtitle)TextView subTitle;
@Bind(R.id.image)ImageView image;
@Bind(R.id.listView)ListView listView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
声明控件时用@Bind
注解id,onCreate()中调用ButterKnife.bind
就完成了注解,这里的this是当前的Activity,当然我们可以直接注解View的id实现方式也超级简单
public class SecondActivityFragment extends Fragment {
@Bind(R.id.title)TextView title;
@Bind(R.id.subtitle)TextView subTitle;
@Bind(R.id.image)ImageView image;
public SecondActivityFragment() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_second, container, false);
ButterKnife.bind(this,view);
return view;
典型的Fragment中的注解方式 ButterKnife.bind(this,view);
变化一下方式就可以让我们注解View。这2个例子都还是在Activity中,再看看下面这个例子
public class MyAdapter extends BaseAdapter {
Context context;
LayoutInflater inflater;
public MyAdapter(Context context) {
this.context = context;
inflater = LayoutInflater.from(context);
}
...省去不重要代码
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if(convertView == null){
convertView = inflater.inflate(R.layout.list_item,parent,false);
holder = new ViewHolder(convertView);
convertView.setTag(holder);
}else{
holder = (ViewHolder)convertView.getTag();
}
holder.title.setText("");
holder.subtitle.setText("");
return convertView;
}
static class ViewHolder{
@Bind(R.id.title)TextView title;
@Bind(R.id.subtitle)TextView subtitle;
public ViewHolder(View view) {
ButterKnife.bind(this,view);
}
}
这才是注解View而不是Activity或者Fragment。需要也别强调一点Butter Knife注解并不是反射代码去实现,它会生成如下代码
public void bind(ExampleActivity activity) {
activity.subtitle = (android.widget.TextView) activity.findViewById(2130968578);
activity.image= (android.widget.TextView) activity.findViewById(2130968579);
activity.title = (android.widget.TextView) activity.findViewById(2130968577);
}
跟我们在代码中写findViewById
其实是一样的,只不过它帮你自动生成。这一点需要特别记住,你要明白其实你做了findViewById
的操作。
仅仅注解findViewById
功能也太少了,它还可以注解事件,具体哪些事件呢?
来看看最简单的OnClick,就跟我们在layout布局中写android:onClick=""
然后在代码中写点击时间一样。
@OnClick(R.id.submit)
public void submit(View view) {
...
}
这里写了参数(View view)
方法里面的参数你可以完全自己决定,比如你也可以不写
@OnClick(R.id.submit)
public void submit() {
...
}
可以多个控件注解同一个事件
@OnClick({R.id.title,R.id.subtitle})
public void click(View v){
Toast.makeText(this,"hehe",Toast.LENGTH_SHORT).show();
}
最后用一个ListView的OnItemClick事件结尾
@OnItemClick(R.id.listView)
public void OnItemSelected(int position){
Toast.makeText(this,"hehe"+position,Toast.LENGTH_SHORT).show();
}
是不是觉得很简单,Butter Knife就是一个这么好用的注解框架,它绝对会让你爱不释手的