Android ButterKnife使用

来源:互联网 发布:足球数据哪里有最全的 编辑:程序博客网 时间:2024/05/21 15:31

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中

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文件

<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中,使用注解

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中使用

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中的使用

 /**     * 适配器     */    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);             }        }    }

总结:
事件注入
点击事件注入

@OnClick(R.id.submit)public void sayHi(Button button) {  button.setText("Hello!");}

多个控件具有相同的事件

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

重置注入

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方法。

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中添加如下代码避免混淆

-dontwarn butterknife.internal.**-keep class **$$ViewInjector { *; }-keepnames class * { @butterknife.InjectView *;}
0 0
原创粉丝点击