Android ButterKnife使用
2015-06-24 14:42
417 查看
Butter Knife:Android的字段和方法绑定视图使用注解处理为您生成样板代码。
消除findViewById调用使用@FindView字段。
使用@FindViews集团多个视图列表。操作都是用行动,setter方法或属性。
消除匿名内部类与@OnClick听众通过注释方法等等。
写这篇blog的时候我用的是Butter Knife5.1.1版本,现在最新的Butter Knife应该是6.1.0版本。推荐大家下载6.1.0的JAR。
Activity中使用:
第一步:将依赖包导入Dependencies中
build.gradle中
第二步,布局activity_main.xml文件
第三步:MainActivit中,使用注解
Fragment中使用
Adapter中的使用
总结:
事件注入
点击事件注入
多个控件具有相同的事件
重置注入
可选注入
默认情况下@InjectView和@OnClick注入是必选的,如果view未找到将出现异常。为了避免出现异常,添加一个@Optional注解
其它
ButterKnife还包含了两个findById方法。
混淆
为避免混淆的时代码被移除,所以要在proguard-project.txt中添加如下代码避免混淆
消除findViewById调用使用@FindView字段。
使用@FindViews集团多个视图列表。操作都是用行动,setter方法或属性。
消除匿名内部类与@OnClick听众通过注释方法等等。
写这篇blog的时候我用的是Butter Knife5.1.1版本,现在最新的Butter Knife应该是6.1.0版本。推荐大家下载6.1.0的JAR。
Activity中使用:
第一步:将依赖包导入Dependencies中
build.gradle中
[code]dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) compile 'com.android.support:appcompat-v7:22.2.0' compile 'com.jakewharton:butterknife:5.1.1' }
第二步,布局activity_main.xml文件
[code]<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <TextView android:id="@+id/tv_title" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="ButterKnife模拟用户登录界面" android:textSize="22sp" android:layout_centerHorizontal="true" android:gravity="center" android:layout_marginTop="72dp"/> <EditText android:id="@+id/et_name" android:hint="请输入用户名" android:layout_below="@id/tv_title" android:layout_marginTop="50dp" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginLeft="6dp" /> <EditText android:id="@+id/et_pwd" android:hint="请输入密码" android:layout_below="@id/et_name" android:layout_marginTop="50dp" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginLeft="6dp" /> <Button android:id="@+id/btn_submit" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="SUBMIT" android:layout_below="@id/et_pwd" android:layout_centerHorizontal="true" android:layout_marginTop="50dp"/> </RelativeLayout>
第三步:MainActivit中,使用注解
[code]public class MainActivity extends Activity { @InjectView(R.id.et_name) EditText nameEditText; @InjectView(R.id.et_pwd) EditText pwdEditText; @OnClick(R.id.btn_submit) void submmit(){ if(nameEditText.getText().toString().equals("420733721") && pwdEditText.getText().toString().equals("123456")){ Toast.makeText(MainActivity.this,getString(R.string.login_sucess),Toast.LENGTH_SHORT).show(); } else { Toast.makeText(MainActivity.this,getString(R.string.login_faild),Toast.LENGTH_SHORT).show(); } } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //初始化ButterKnife ButterKnife.inject(this); } }
Fragment中使用
[code]public class AFragment extends Fragment { @InjectView(R.id.tv_f) TextView textView; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view=inflater.inflate(R.layout.f_a,container,false); ButterKnife.inject(this,view); textView.setText("This is Fragment A !"); return view; } }
Adapter中的使用
[code] /** * 适配器 */ public class MyAdapter extends BaseAdapter{ private Context mContext; private String[] strings; private LayoutInflater mInflater; public MyAdapter(String[] strings, Context mContext) { this.strings = strings; this.mContext = mContext; mInflater=LayoutInflater.from(mContext); } @Override public int getCount() { return str.length; } @Override public Object getItem(int i) { return str[i]; } @Override public long getItemId(int i) { return i; } @Override public View getView(int i, View view, ViewGroup viewGroup) { ViewHolder holder; if(view==null){ view=mInflater.inflate(R.layout.item_list,viewGroup,false); holder=new ViewHolder(view); view.setTag(holder); }else { holder= (ViewHolder) view.getTag(); } holder.itemTextView.setText(strings[i]); return view; } class ViewHolder{ @InjectView(R.id.item_tv) TextView itemTextView; public ViewHolder(View view){ ButterKnife.inject(this,view); } } }
总结:
事件注入
点击事件注入
[code]@OnClick(R.id.submit) public void sayHi(Button button) { button.setText("Hello!"); }
多个控件具有相同的事件
[code]@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(); } }
重置注入
[code]public class FancyFragment extends Fragment { @InjectView(R.id.button1) Button button1; @InjectView(R.id.button2) Button button2; @Override View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fancy_fragment, container, false); ButterKnife.inject(this, view); // TODO Use "injected" views... return view; } @Override void onDestroyView() { super.onDestroyView(); ButterKnife.reset(this); } }
可选注入
默认情况下@InjectView和@OnClick注入是必选的,如果view未找到将出现异常。为了避免出现异常,添加一个@Optional注解
其它
ButterKnife还包含了两个findById方法。
[code]View view = LayoutInflater.from(context).inflate(R.layout.thing, null); TextView firstName = ButterKnife.findById(view, R.id.first_name); TextView lastName = ButterKnife.findById(view, R.id.last_name); ImageView photo = ButterKnife.findById(view, R.id.photo);
混淆
为避免混淆的时代码被移除,所以要在proguard-project.txt中添加如下代码避免混淆
[code]-dontwarn butterknife.internal.** -keep class **$$ViewInjector { *; } -keepnames class * { @butterknife.InjectView *;}
相关文章推荐
- AndroidManifest.xml文件属性详解
- Android开发Git:代码冲突常见解决方法
- android 如何把activity变成dialog
- Android JNI javah 命令使用
- androidstudio项目目录结构(抽时间去了解??)
- android让界面不被弹出的键盘挤上去
- Sundy Android高级应用课程
- android隐藏以及显示软键盘以及不自动弹出键盘的方法
- Android捕获View焦点事件,LinearLayout结合HorizontalScrollView实现ViewPgaer和选项卡Tabs联动
- android获取SD卡状态
- android获取mac地址
- Android学习笔记04:Android 缓冲进度条或加载进度条
- android获得手机联系人信息代码
- Android 4.2中对WebView.addJavascriptInterface()的修改
- android如何对应用进行单元测试
- Android RecyclerView 使用完全解析 体验艺术般的控件
- DecimalFormat用法
- Nuplayer related source file description
- Location-Aware-Instant:开发即时位置感知的Android客户端
- android 获取内部存储器列表