同步發表於 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的方法聲明約定,猜想也是利用這種方式實現的。