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