ButterKnife源码解析

关于ButterKnife的使用我就不讲了,很简单,随便搜搜网上一大堆。

下面一个案例就是我使用ButterKnife生成的代码:

public class MainActivity extends AppCompatActivity {

    @BindView(R.id.tv_01)
    TextView tv01;
    @BindView(R.id.tv_02)
    TextView tv02;
    @BindView(R.id.btn_01)
    Button btn01;
    private Unbinder mUnbinder;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mUnbinder = ButterKnife.bind(this);

        tv01.setText("00000000");
        tv02.setText("00999900000099");
    }


    @OnClick(R.id.btn_01)
    public void onViewClicked() {
        Toast.makeText(this,"hhhhh",Toast.LENGTH_SHORT).show();
    }

    @Override
    protected void onDestroy() {
        mUnbinder.unbind();
        super.onDestroy();
    }

}

我们在Android Studio中找到如下文件夹:

 可见,ButterKnife的核心就是apt生成了一个中间类,我们看一下这个中间类:

public class MainActivity_ViewBinding implements Unbinder {
  private MainActivity target;

  private View view2131165218;

  @UiThread
  public MainActivity_ViewBinding(MainActivity target) {
    this(target, target.getWindow().getDecorView());
  }

  @UiThread
  public MainActivity_ViewBinding(final MainActivity target, View source) {
    this.target = target;

    View view;
    target.tv01 = Utils.findRequiredViewAsType(source, R.id.tv_01, "field 'tv01'", TextView.class);
    target.tv02 = Utils.findRequiredViewAsType(source, R.id.tv_02, "field 'tv02'", TextView.class);
    view = Utils.findRequiredView(source, R.id.btn_01, "field 'btn01' and method 'onViewClicked'");
    target.btn01 = Utils.castView(view, R.id.btn_01, "field 'btn01'", Button.class);
    view2131165218 = view;
    view.setOnClickListener(new DebouncingOnClickListener() {
      @Override
      public void doClick(View p0) {
        target.onViewClicked();
      }
    });
  }

  @Override
  @CallSuper
  public void unbind() {
    MainActivity target = this.target;
    if (target == null) throw new IllegalStateException("Bindings already cleared.");
    this.target = null;

    target.tv01 = null;
    target.tv02 = null;
    target.btn01 = null;

    view2131165218.setOnClickListener(null);
    view2131165218 = null;
  }
}

通过bind方法将Activity实例传进来,然后实现findViewById和setOnClickListener等。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AD钙奶-lalala

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值