您的位置:首页 > 移动开发 > Android开发

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中

[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 *;}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: