<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                ## 代碼結構 ![](https://img.kancloud.cn/01/c8/01c8d0456046afa1f01b9616982902b7_529x312.png) * butterknife ;android library model 提供android使用的API * butterknife-annotations; java-model,使用時的注解 * butterknife-compiler;java-model,編譯時用到的注解的處理器 * butterknife-gradle-plugin;自定義的gradle插件,輔助生成有關代碼 * butterknife-integration-test;該項目的測試用例 * butterknife-lint;該項目的lint檢查 * sample;demo ## annotations ### @Bind ~~~ @Retention(CLASS) @Target(FIELD) public @interface Bind { /** View ID to which the field will be bound. */ @IdRes int[] value(); } ~~~ ### @OnClick ~~~ public @interface OnClick { /** View IDs to which the method will be bound. */ @IdRes int[] value() default { View.NO_ID }; } ~~~ ## compiler 源碼咱們先忽略,主要使用javapoet生成代碼,我們先看處理之后的效果 ![](https://img.kancloud.cn/bc/56/bc56d4d25832e9e7b2a3ff0d33606b83_284x45.png) **AnnotationActivity** ~~~ public class AnnotationActivity extends Activity { @Bind({2131558508}) Button button; @OnClick({2131558508}) public void Onclick(){ Toast.makeText(this, "helloWorld", 0).show(); } protected void onCreate(Bundle paramBundle) { super.onCreate(paramBundle); setContentView(2130968601); ButterKnife.bind(this); ~~~ **生成的AnnotationActivity$$ViewBinder** ~~~ public class AnnotationActivity$$ViewBinder<T extends AnnotationActivity> implements ButterKnife.ViewBinder<T> { public void bind(ButterKnife.Finder paramFinder, final T paramT, Object paramObject) { View localView = (View)paramFinder.findRequiredView(paramObject, 2131558508, "field 'button' and method 'Onclick'"); paramT.button = ((Button)paramFinder.castView(localView, 2131558508, "field 'button'")); localView.setOnClickListener(new DebouncingOnClickListener() { public void doClick(View paramAnonymousView) { paramT.Onclick(); } }); } public void unbind(T paramT) { paramT.button = null; ~~~ ## API 入口函數為ButterKnife.bind(this) ![](https://img.kancloud.cn/c8/0a/c80a7e52058aeeb45976d689f04431d1_862x709.png) bind函數根據調用的類名查找其對應的className\_ViewBinding的類名,然后反射調用其構造函數。 ## 參考資料 [深入理解ButterKnife源碼并掌握原理(一)](https://blog.csdn.net/ta893115871/article/details/52497297) [ButterKnife源碼解析](https://www.jianshu.com/p/036a635da941)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看