天天看點

android:onClick都做了什麼

同步發表于 http://avenwu.net/viewinject/2015/01/28/android_onclick/

相信大家都知道在layout裡面可以給view寫android:onClick屬性,有沒有好奇過它的内部是怎麼實作的?

前言

在用android:onClick的時候會有一些有意思的事情:

比如說一般情況所在layout隻能是Activity的,也就是說如果有一個Fragment對應的layout.xml,如果你在xml裡寫了android:onClick=“myClick”,同時在Fragment内實作public void myClick(View view),是會報錯的。這是因為必須在Activity中聲明該方法。
           

源碼分析

找到android.view.View,可以發現這麼一段代碼:

代碼比較好了解,首先解析出android:onClick的值,即擷取方法名,然後通過反射,擷取到Activity中對應的方法,并執行,如果找不對應方法則抛出異常。

  • 為什麼是Activity?

    getContext().getClass()實際上view中的context都是其所在的Activity執行個體,那getClass之後當然就是在Activity中找

  • 有什麼用?

    通過反射來通路方法其實是比較常見的,如果我們适當的加以利用那麼也可以實作一定程度的代碼配置,比如EventBus,中也有基于onEventXXX的方法聲明約定,猜想也是利用這種方式實作的。

作者:小文字

出處:http://www.cnblogs.com/avenwu/

本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利.