学习笔记

ButterKnife源码分析
Publish: 2018/7/29   

ButterKnife源码分析

使用规则

用法


 /**
  * 关于我们
  */
 public class AboutUsActivity extends SwipeBackActivity {
    @BindView(R.id.toolbar_title)
    TextView toolbarTitle;
    @BindView(R.id.aau_version_tv)
    TextView aauVersionTv;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_about_us);
        ButterKnife.bind(this);
        MobclickAgent.onEvent(this, "aboutUsActivity");
        toolbarTitle.setText(getResources().getString(R.string.about_us));
        aauVersionTv.setText(String.format("V:%s", AppUtils.getVersionName(this)));
    }

    @OnClick(R.id.toolbar_left)
    public void onViewClicked() {
        onBackPressed();
    }
 }

ButterKnife.bind(this);


  @NonNull @UiThread
  public static Unbinder bind(@NonNull Activity target) {
    View sourceView = target.getWindow().getDecorView();
    return createBinding(target, sourceView);
  }

  private static Unbinder createBinding(@NonNull Object target, @NonNull View source) {
    Class targetClass = target.getClass();
    ...
    Constructor constructor = findBindingConstructorForClass(targetClass);
    ...
    return constructor.newInstance(target, source);
    ...
  }

  @Nullable @CheckResult @UiThread
  private static Constructor findBindingConstructorForClass(Class cls) {
    Constructor bindingCtor = BINDINGS.get(cls);
    if (bindingCtor != null) {
      return bindingCtor;
    }
    String clsName = cls.getName();
    ...
      Class bindingClass = cls.getClassLoader().loadClass(clsName + "_ViewBinding");
      //noinspection unchecked
      bindingCtor = (Constructor)bindingClass.getConstructor(cls, View.class);
      ...
    BINDINGS.put(cls, bindingCtor);
    return bindingCtor;
  }

AboutUsActivity_ViewBinding

通过Utils.findRequiredViewAsType(View source,int id,String who,Class cls)给传入的target对象中@BindView的属性赋值,通过Utils.findRequiredView(View source,int id, String who)设置OnClickListener。


 public class AboutUsActivity_ViewBinding implements Unbinder {
   private AboutUsActivity target;

   private View view2131296856;

   @UiThread
   public AboutUsActivity_ViewBinding(AboutUsActivity target) {
     this(target, target.getWindow().getDecorView());
   }

   @UiThread
   public AboutUsActivity_ViewBinding(final AboutUsActivity target, View  source) {
     this.target = target;

     View view;
     target.toolbarTitle = Utils.findRequiredViewAsType(source,  R.id.toolbar_title, "field 'toolbarTitle'", TextView.class);
     target.aauVersionTv = Utils.findRequiredViewAsType(source, R.id.aau_version_tv, "field 'aauVersionTv'", TextView.class);
     view = Utils.findRequiredView(source, R.id.toolbar_left, "method 'onViewClicked'");
     view2131296856 = view;
     view.setOnClickListener(new DebouncingOnClickListener() {
       @Override
       public void doClick(View p0) {
         target.onViewClicked();
       }
     });
   }

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

     target.toolbarTitle = null;
     target.aauVersionTv = null;

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



← Android开发艺术探索_1Activity Java容器类 →

Powered by Hexo, Theme designs by @hpcslag.
Style-Framework Tocas-UI designs by @yamioldmel