Android ButterKnife使用

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 *;}

你可能感兴趣的:(Android ButterKnife使用)