ǰÑÔ
¡¡¡¡¼øÓÚÈÕÒæÇ¿Áҵľ«Ï¸»¯ÔËÓªÐèÇó£¬ÍøÒ×ÀֵôÓÈ¥Ä꿪ʼ¹¹½¨´óÊý¾Ýƽ̨£¬<<ÎÞÂñµãÊý¾ÝÊÕ¼¯SDK>>Òò´ËÁ¢ÏÓÃÓÚÏò´óÊý¾Ýƽ̨ÌṩȫÁ¿£¬ÍêÕû£¬×¼È·µÄ¿Í»§¶ËÊý¾Ý£®
¡¡¡¡<<ÎÞÂñµãÊý¾ÝÊÕ¼¯SDK>>Android¶Ë´Ó×ÅÊÖ£¬µ½¾ÀúÖØ¹¹£¬Öð²½ÍêÉÆµ½ÏÖÔÚÒѾÓпìÒ»ÄêµÄʱ¼äÁË£®ÆÚ¼ä´Ó¿ªÔ´ÉçÇøÒÔ¼°Í¬ÐÐÖеõ½ÁËһЩºÜÓÐÒâÒåµÄ¼¼Êõ²Î¿¼£¬Òò´ËÔÚÕâ¸öSDKÇ÷ÓÚÍêÉÆµÄ½ñÌ죬ÎÒÃÇÒ²¿¼Âǽ«Õâһ·ÔÚ¼¼ÊõÉϵÄ̽Ë÷¾ÀúºÍÊÕ»ñ·ÖÏí³öÀ´£®
4ÔÂ16-18ÈÕ£¬QCon±±¾©2017È«ÇòÈí¼þ¿ª·¢´ó»áÉÏÓÐͬÊ´ú±íAndroid/IOSÁ½¶Ë½øÐÐͳһµÄ¼¼Êõ·ÖÏí£¬»¶Ó´ó¼Òǰȥ½»Á÷
ÎÒÃÇ»áÖð½¥ÕûÀíһЩ¼¼ÊõÎÄÕµ½Õâ¸ö¼òÊéÕ˺š°Òƶ¯¶ËÊý¾ÝÊÕ¼¯ºÍ·ÖÎö¡±
¡¡¡¡Ö®Ç°¹ØÓÚAndroid¶ËµÄ<<ÎÞÂñµãÊý¾ÝÊÕ¼¯SDK>>ʹÓõļ¼Êõ£¬Ð´ÁËһƪÎÄÕÂ<<Android
AOPÖ®×Ö½ÚÂë²å×®>>£¬Õâ¸öÊÇAndroid¶Ë½øÐÐÒ»ÇÐÊÕ¼¯µÄÆðµã£¬ÎÒÃǾÍÊÇÓÃÕâ¸ö·½·¨ÇáËÉÄõ½¸÷ÖÖ£¢Hook£¢µãµÄ£®
¡¡¡¡±¾ÆªÎÄÕÂÔò½Ó׎²Ò»Ï¹ØÓÚÊÕ¼¯SDKÄÚ²¿ÊÕ¼¯Âß¼µÄһЩ¹Ø¼ü¼¼Êõ.
Ŀ¼
Ò»¡¢¸ÅÊö
1.1 SDKÊý¾ÝÊÕ¼¯ÄÜÁ¦ÏÖ×´
1.2 ¹Ø¼ü¼¼Êõµã¸ÅÊö
¶þ¡¢ViewµÄΨһ±êʶ£¨ID£©
2.1 µ÷ÑÐ
2.2 ÀûÓÃViewTree¹¹½¨ViewID
2.3 ViewPathµÄÉú³É
2.4 ViewPathµÄÓÅ»¯
Èý¡¢Ò³ÃæµÄ»®·Ö
3.1 ºÏÀí»®·ÖÒ³ÃæµÄÖØÒªÐÔ
3.2 AndroidÖеÄÒ³Ãæ
3.3 Ò³ÃæÃû×é³É
ËÄ¡¢ÎÞÐèÂñµãÇáËÉÊÕ¼¯¶¨ÖƵÄÒµÎñÊý¾Ý
4.1 ÅäÖÃʾÀý
4.2 ÎÞÂñµãÊÕ¼¯Á÷³Ì
4.3 Êý¾Ý·¾¶£¨DataPath£©
Îå¡¢½áÓï
Ò»¡¢¸ÅÊö
¡¡¡¡±¾²¿·ÖÊ×ÏȼòÒª½éÉÜÒ»ÏÂÎÒÃǵÄÊÕ¼¯·½°¸Ä¿Ç°¿ÉÒÔÊÕ¼¯µ½ÄÄЩÊý¾Ý£¬È»ºó¶ÔÓÚ±¾ÎÄÖØµã½éÉܵÄÈý¸ö¼¼Êõµã½øÐиÅÊö£®
1.1 SDKÊý¾ÝÊÕ¼¯ÄÜÁ¦ÏÖ×´
¡¡¡¡Ä¿Ç°ÎÒÃǵÄSDK½øÐÐÊý¾ÝÊÕ¼¯Ê±»ù±¾ÓÐÁ½¸öÄÜÁ¦£º
a. ͨÓÃÊý¾ÝÈ«Á¿ÊÕ¼¯
¡¡¡¡Í¨ÓÃÊý¾ÝÖ¸µÄÊÇÓëÒµÎñÎ޹صÄÓû§ÐÐΪÊý¾Ý£¬ÎÞÂÛÊǵçÉÌÓ¦Óû¹ÊÇÉçÇøÓ¦Ó㬽ÓÈëSDKºóͨÓÃÊý¾ÝµÄÊÕ¼¯É϶¼ÊÇÎÞ²îµÄ£¬ÕâЩͨÓÃÊý¾Ý´óÖÂÓУº

b. ÒµÎñÏà¹ØÊý¾ÝÐèÇóͨ¹ýÏ·¢ÅäÖýøÐÐÎÞÂñµã¶¨ÖÆÊÕ¼¯
¡¡¡¡³ýÁËÉÏÊöͨÓÃÊý¾Ý£¬Óë¾ßÌåÒµÎñÏà¹ØµÄÊý¾ÝÊÕ¼¯¡£ÄÃÍøÒ×¹ó½ðÊôµÄÊ×Ò³¾Ù¸öÀý×Ó£º

ͼ1-1 ÎÞÂñµãÊÕ¼¯ÒµÎñÊý¾ÝʾÀý
¡¡¡¡¼ÙʹÐèÒªÔÚÓû§µã»÷ÉÏͼºì¿òÇøÓòʱ£¬°Ñ¡°ÔÁ¹óÒø¡±Õâ¸ö½»Òׯ·µÄID£¨»òÕßÏ·½ÏÔʾµÄÖ¸ÊýµÈ£¬Ö»ÒªÔÚÄÚ´æÖдæÔÚµÄÊý¾Ý¶¼¿ÉÒÔ£©Ò»Æð±¨ÉÏÀ´¡£
¡¡¡¡¶ÔÓÚ´ËÖÖÐèÇó£¬Êý¾ÝÊÕ¼¯SDK×öµ½ÁËÎÞÐèÂñµã£¬²»ÒÀÀµ¿ª·¢ÖÜÆÚ£¬Í¨¹ýÏßÉÏÏ·¢Ò»Ð©ÅäÖÃÐÅÏ¢£¬¼´¿É¼´Ê±½øÐÐÊý¾ÝÊÕ¼¯¡£¾ßÌåÔÀíµÚËĽÚÐðÊö¡£
1.2¹Ø¼ü¼¼Êõµã¸ÅÊö
a. ViewµÄΨһ±êʶ£¨ID£©,£¨Ïê¼û±¾Îĵڶþ½Ú£©
¡¡¡¡µ±ÎÒÃÇÊÕ¼¯¿Ø¼þÊý¾ÝʱÅöµ½µÄµÚÒ»¸öÎÊÌâ¾ÍÊÇ£ºÈçºÎ°Ñ½çÃæÉϵÄÈκÎÒ»¸öViewÓëÆäËûViewÇø·Ö¿ªÀ´.
±ÈÈ磺ij¸öButton±»µã»÷ÁË
ÎÒÃÇÔÚÉϱ¨Êý¾ÝµÄʱºòÐèÒª°ÑÕâ¸öButtonºÍÆäËûËùÓпؼþ£¨±ÈÈçÁíÒ»¸öButton£¬ÁíÒ»¸öImageViewµÈ£©Çø·Ö¿ªÀ´£¬ÕâÑùÕâÌõÉϱ¨µÄÊý¾Ý²ÅÄܱíʾ£¢¾ÍÊÇÄǸöButton±»µã»÷ÁËһϣ¢.
¡¡¡¡Õâ¾ÍÐèҪΪ½çÃæÉϵÄÿһ¸ö¿Ø¼þÉú³ÉÒ»¸öΨһµÄID. ´ËID³ýÁ˾ßÓÐÇø·ÖÐÔ£¬»¹ÐèÒªÓÃÓÚÒ»ÖÂÐÔ£®Ò»ÖÂÐÔÊÇͬһ¸öViewÎÞÂÛ½çÃæ²¼¾ÖÈçºÎ¶¯Ì¬±ä»¯£¬»òÕß˵¶à´Î½øÈëÍ¬Ò»Ò³Ãæ£¬´ËIDÐèÒª±£³Ö²»±ä£®
b. Ò³ÃæµÄ»®·Ö£¬£¨Ïê¼û±¾ÎĵÚÈý½Ú£©
¡¡¡¡³ýÁËActivityÓÐЩFragmentÒ²ÐèÒª¿´×÷Ò³Ãæ£¬Õâ¾ÍÒªÇó£º
1.ÔÚFragment show/hideʱÉϱ¨Ïà¹ØÒ³ÃæÊ¼þ£®
2.Ò³ÃæFragmentÖз¢ÉúµÄÓû§½»»¥Ê¼þÒ²ÐèÒª¹éÓÚ´ËFragmentÒ³Ãæ£¬¼´µã»÷ij¸öViewÐèÒªÉϱ¨Ò³ÃæFragmentµÄÐÅÏ¢£¨´ÓViewÖÐÔõô»ñÈ¡FragmentÐÅÏ¢£¿£©
c. ÎÞÐèÂñµãÇáËÉÊÕ¼¯¶¨ÖƵÄÒµÎñÊý¾Ý£¬£¨Ïê¼û±¾ÎĵÚËĽڣ©
¡¡¡¡ÈçÇ°ÃæËùÊö£¬Ä¬ÈÏÇé¿öÏÂÊý¾ÝÊÕ¼¯SDK»áÊÕ¼¯È«Á¿µÄÓû§½»»¥Êý¾Ý£¬¶ÔÓÚ¶¨ÖƵÄÒµÎñÊÕ¼¯ÐèÇó£¬Êý¾ÝÊÕ¼¯SDKÒ²×öµ½ÁËÎÞÐè´úÂëÂñµã£¬Í¨¹ýÏßÉÏÏ·¢Ò»Ð©ÅäÖýøÐм´Ê±ÊÕ¼¯£®
¶þ¡¢ViewµÄΨһ±êʶ£¨ID£©
2.1 µ÷ÑÐ
¡¡¡¡ÓÃÓÚÇø·Ö½çÃæÉÏÿ¸öViewµÄID? AndroidϵͳÊÇ·ñÌṩ¸øÁËÎÒÃÇÕâ¸öID?
ȷʵ,AndroidϵͳÌṩÁËÒ»¸öID,view.getId()¼´¿É»ñµÃÒ»¸öintÐ͵ÄidÓÃÓÚÇø·ÖView,µ«ÊÇÕâ¸öIDÒòΪÒÔÏÂÁ½¸öÔÒòÈ´²¢²»ÄÜÂú×ãÎÒÃǵÄÐèÒª.
1.ÓÐÏ൱һ²¿·ÖviewÊÇNO_ID£¬±ÈÈçÔÚ²¼¾ÖÎļþÖÐδָ¶¨id,»òÕßÖ±½ÓÔÚ´úÂëÀïÃænew³öÀ´view£¬view.getId()·µ»ØµÄÈ«²¿¶¼ÊÇNO_ID
2.Õâ¸öIDÊDz»Îȶ¨µÄ£¬ÓÉÓÚÕâ¸öIDÆäʵ¾ÍÊÇÿ´Î±àÒë²úÉúµÄRÎļþÖеÄint³£Á¿£¬Òò´Ëͬһ¸ö°´Å¥£¬Á½¸ö°æ±¾±àÒë³öÀ´µÄIDºÜ¿ÉÄÜʱ²»Ò»ÑùµÄ£®
Òò´Ë£¬ÎÒÃÇÖ»ÄÜ×Ô¼º¶¯ÊÖ¹¹½¨ÎÒÃǵÄIDà¶£¬Ôõô¹¹½¨£¿´ð°¸ÊÇÀûÓÃËùÊôPage+ViewTree¹¹½¨ViewID.
2.2 ÀûÓÃViewTree¹¹½¨ViewID
¡¡¡¡ÔÚAndroidµÄ¸ÅÄîÀÿ¸öWindow(ActivityWindow/DialogWindow/PopupWindowµÈ)ÉÏÃæ¶¼Éú³¤×ÅÒ»¿ÃViewTree.¶øÆÁÄ»Öп´µ½µÄ¸÷Öֿؼþ(ImageView/ButtonµÈ)¶¼ÊÇÕâ¿ÃViewTreeÉϵĽڵ㣮
¡¡¡¡ÓÐAndroid¿ª·¢»·¾³µÄͬѧֻÐèÒª´ò¿ªAndroidDeviceMonitor-dump
view hierarchy ¾Í¿ÉÒÔ¿´µ½ViewTreeµÄÄ£Ñù£¬ÈçÏÂͼ£º

ͼ2-1 ViewTree¸ÅÄîͼ
Òò´Ë£¬ÎÒÃÇÃÈÉú³öÒ»¸öÏë·¨£º
1.ÀûÓÃPage+ViewTreeÖеÄλÖù¹½¨ViewID.
ViewÔÚViewTreeÖеÄλÖÃÖ÷ÒªÓÃÁ½µãÀ´È·¶¨£º
2.×ÝÏòµÄÉî¶È
3.ºáÏòµÄindex
¿¼ÂÇÕâÁ½¸öÒòËØºó£¬ÎÒÃǶ¨ÒåÒ»¸öViewPath:
ViewPath£ºµ±Ç°viewµ½ViewTree¸ù½ÚµãµÄÒ»Ìõ·¾¶£¬ÓÃÓÚÔÚViewTreeÖÐΨһ¶¨Î»µ±Ç°view¡£Â·¾¶ÖеÄÿ¸ö½Úµã°üº¬Á½²¿·ÖÐÅÏ¢,¼´½ÚµãViewÀàÐÍÐÅÏ¢£¬ÒÔ¼°½ÚµãViewÔÚÐÖµÜÖеÄindex¡£
ÈçÏÂͼ£¬ÊÇÒ»¸ö¼òµ¥µÄViewTreeÄ£ÐÍ£¨¼òµ¥µ½Éî¶ÈÖ»ÓÐÁ½²ã£¬Ã¿²ãÖ»ÓÐÁ½Èý¸ö¿Ø¼þ£©

ͼ2-2 ViewTreeÄ£ÐÍͼ
°´ÕÕ֮ǰ¸øµÄ¶¨Ò壬ÉÏͼÖпؼþ1£¬2£¬3,4µÄViewPathÈçÏÂ
¿Ø¼þ1ViewPath: RootView/LinearLayout[0]
indexΪ1±íʾ´Ë½ÚµãÊÇÐֵܽڵãÖеÚÒ»¸ö¿Ø¼þ ¿Ø¼þ4ViewPath: RootView/LinearLayout[0]
/ChildView1[0] ¿Ø¼þ2ViewPath: RootView/RelativeLayout[1] ¿Ø¼þ3ViewPath: RootView/LinearLayout[2] |
ÉÏÊö¸ø³öµÄViewPathÖУ¬Ã¿¸ö½Úµã£¨³ýÁËÊ׽ڵ㣩ÓÐÁ½²¿·ÖÄÚÈÝ£º
1.LinearLayout,RelativeLayout,ChildView1µÈViewTypeÐÅÏ¢£¨½ÚµãViewµÄÀàÐÍ£©
2."[]"ÄÚµÄindexÐÅÏ¢£¬´Ëindexָʾ´Ë½ÚµãÊÇÐֵܽڵãµÄµÚ¼¸¸ö
ÕâÊÇ×î³õµÄViewPath,ÓÃViewPath¶¨Î»view£¬ÓÐÁ½µãÌØ±ðÖØÒª£º
1.Ò»ÖÂÐÔ£º ͬһ¸öviewµÄViewPathÔÚViewTreeµÄ¶¯Ì¬±ä»¯ÖÐÓ¦±£³Ö²»±ä
2.Çø·Ö¶È£º ²»Í¬viewµÄViewPathÓ¦¸Ã²»Í¬
°´ÕÕÕâ¸ö×î³õµÄViewPath¶¨ÒåÔÚʵ¼ùÖл¹²»ÄÜÔÚÒ»ÖÂÐÔºÍÇø·Ö¶ÈÉÏÂú×ãÎÒÃǵÄÐèÇ󣬺óÃæ»á¶ÔViewPath½øÐÐÓÅ»¯¡£
2.3 ViewPathµÄÉú³É
¡¡¡¡ÉÏÃæÎÒÃÇÓɹ¹½¨ViewIDµÄÐèÇóÒý³öÁËViewPathµÄ¶¨Ò壬ÄÇôµ±½»»¥Ê¼þ£¨ÀýÈ磺°´Å¥µã»÷£©·¢Éúʱ£¬ÎÒÃÇÈçºÎÉú³É´Ë¿Ø¼þµÄViewPath£¿
¡¡¡¡ÈçÉÏһƪÎÄÕÂ<<Android AOPÖ®×Ö½ÚÂë²å×®>>ËùÊö£¬µ±Óû§µã»÷ij¸ö°´Å¥Ê±£¬ÎÒÃDzåÈëOnClickListener.OnClick·½·¨ÖеÄÈçÏ´úÂ뽫»á±»µ÷Óãº
Monitor.onViewClick(view); |
ÉÏÃæ£¬Èë²Îview¼´Îªµ±Ç°±»µã»÷µÄview£¬»ñÈ¡´ËviewµÄViewPathα´úÂëÈçÏ£º
public static ViewPath getPath
(View view) { do { //1. ¹¹ÔìViewPathÖÐÓÚview
¶ÔÓ¦µÄ½Úµã
:ViewType[index] ViewType=view.getClass()
.getSimpleName(); index=viewÔÚÐֵܽڵãÖеÄindex; ViewPath½Úµã=ViewType[index]; }while ((view=view.getParent()
)instanceo
f View);//2. ½«viewÖ¸ÏòÉÏÒ»¼¶µÄ½Úµã } |
¹¹Ôì³öÀ´µÄViewPathÈçÏÂÃæÀý×ÓËùʾ£º
DecorView/LinearLayout[0]/
FrameLayout[0]
/ActionBarOverlayLayout[0]/
ContentFrameLayout[0]
/FrameLayout[0]/LinearLayout[0]
/ViewPager[0]
/ButtonFragment[0]/AppCompat
Button[0] |
2.4 ViewPathµÄÓÅ»¯
a. Ò»ÖÂÐÔÓÅ»¯1
Çé¾°£º
ÔÚͼ2-2 ViewTreeÄ£ÐÍͼÖУ¬Èç¹ûÏñÏÂÃæÍ¼ÖÐËùʾ£¬Ôڿؼþ2ºÍ3Öж¯Ì¬²åÈëÒ»¸öFrameLayoutÄØ£¿

ͼ2-3 Android½çÃæ¶¯Ì¬ÐԱ仯Çé¾°1
´Ëʱ°´ÕÕÔʼViewPathµÄ¶¨Ò壬ÎÒÃÇÀ´¿´¿´¿Ø¼þ3µÄViewPath·¢ÉúÁËÄÄЩ±ä»¯£¿
ViewTree¶¯Ì¬±ä»¯Ç°: RootView/LinearLayout[2] ViewTree¶¯Ì¬±ä»¯ºó: RootView/LinearLayout[3] |
ÓÅ»¯£º
ViewPath½ÚµãÖÐindexµÄº¬Òå´Ó¡°ÐֵܽڵãµÄµÚ¼¸¸ö¡±ÓÅ»¯Îª:¡°ÏàͬÀàÐÍÐֵܽڵãµÄµÚ¼¸¸ö¡±
ÓÅ»¯ºó,·¢Éúͼ2-3Ëùʾ½çÃæ²¼¾Ö¶¯Ì¬±ä»¯Ê±£¬¿Ø¼þ3µÄViewPath±ä»¯Îª£º
ViewTree¶¯Ì¬±ä»¯Ç°: RootView/LinearLayout[1]
indexΪ1±íʾ´Ë½ÚµãÊÇÐֵܽڵãÖеڶþ¸öLinearLayout ViewTree¶¯Ì¬±ä»¯ºó: RootView/LinearLayout[1] |
¿ÉÒÔ¿´³ö£¬´Ë´¦ÓÅ»¯Ê¹¿Ø¼þ3µÄViewPathÔÚViewTree¶¯Ì¬²åÈë³ýÁËLinearLayoutÖ®ÍâÆäËüÈκÎÀàÐÍʱ¶¼±£³ÖǰºóÒ»Ö¡£
b. Ò»ÖÂÐÔÓÅ»¯2
Çé¾°£º
ÔÚͼ2-2 ViewTreeÄ£ÐÍͼÖУ¬Èç¹ûÏñÏÂÃæÍ¼ÖÐËùʾ£¬Ôڿؼþ2ºÍ3Öж¯Ì¬²åÈëÒ»¸öLinearLayoutʱ£¬¿Ø¼þ3µÄViewPathÄÜ·ñ¼ÌÐø±£³ÖǰºóÒ»Ö£¿
°´ÕÕÉÏÊöÇé¾°£¬¿Ø¼þ3ViewPathµÄ±ä»¯ÈçÏ£º
ViewTree¶¯Ì¬±ä»¯Ç°: RootView/LinearLayout[1]
indexΪ1±íʾ´Ë½ÚµãÊÇÐֵܽڵãÖеڶþ¸öLinearLayout ViewTree¶¯Ì¬±ä»¯ºó: RootView/LinearLayout[2]
Ç°Ãæ²åÈëÒ»¸öLinearLayoutµ¼Ö´˽ڵã±äΪÐֵܽÚ
µãÖеÚÈý¸öLinearLayoutÁË |
ÎÊÌâ
ÉÏÊöÇé¾°Ö¸µÄÆäʵÊÇÒ»¸öÎÊÌ⣺ViewTreeÖÐͬÀàÐÍÐֵܽڵ㶯̬±ä»¯£¨²åÈë/ÒÆ³ý/ÒÆÎ»£©Ó°ÏìViewPathµÄÒ»ÖÂÐÔ
1.ViewPath½ÚµãÖеÄindex£¬ÔÚͬÀàÐÍ£¨ViewTypeÏàͬ£¬ÀýÈç¶¼ÊÇLinearLayout£©Ðֵܽڵ㶯̬¼ÓÈë/ɾ³ýʱ£¬µ±Ç°½ÚµãµÄindexÎÞ·¨Ôڱ仯ǰºó±£³ÖÒ»Ö¡£
2.¡°Ò»ÖÂÐÔÓÅ»¯1¡±ÖеÄÓÅ»¯¿ÉÒÔµÖÓù²»Í¬ÀàÐÍÐֵܽڵãµÄÓ°Ï죬ȴ¶ÔͬÀàÐÍÐֵܽڵãµÄÓ°ÏìÎÞ¿ÉÄκΡ£
´ÓViewPathµÄ¶¨ÒåÉÏÄÑÒÔÕÒµ½ÔÚͬÀàÐÍÐֵܽڵ㶯̬±ä»¯Ç°ºó±£³ÖÒ»Öµķ½·¨£¬µ«ÎÒÃÇ¿ÉÒÔ·ÖÎö·¢Éú´ËÖÖ½çÃæ¶¯Ì¬±ä»¯µÄÇé¾°£º
1.ʹÓÃFragmentµÄ¶¯Ì¬²¼¾Ö
¡¡¡¡Android½çÃæµÄ¶¯Ì¬²¼¾Ö·¢ÉúÇé¾°ÖУ¬Ê¹ÓÃFragmentʵÏÖ½çÃæ¶¯Ì¬±ä»¯µÄƵÂʺÍÓ°Ïì¿Ø¼þÊýÁ¿»¹ÊDZȽϴóµÄ£¨Ïà¶ÔÓÚÖ±½ÓaddView()£©
2.ListView£¨µÈ¿É¸´ÓÃView£©ÖÐͬÀàÐ͵ÄitemViews¡£
¡¡¡¡´ËÖÖÇé¿öËäȻûÓз¢ÉúÔÚÒ»¸öitemViewǰ¶¯Ì¬²åÈëÒ»¸öitemView,µ«ÊÇÓÉÓÚitemViewµÄ¸´Ó㬵¼ÖÂitemViewչʾµÄÄÚÈݺÍÔÚ¸¸½ÚµãlistViewÄÚµÄindexµÄ¶ÔÓ¦¹ØÏµ¶¯Ì¬±ä»¯£¬Òò´ËÒ²¹éÓÚ´ËÀà¡£
2ÖÐËù˵¡°ListViewµÈ¿É¸´ÓÃView¡±Ôì³ÉµÄÎÊÌâºóÃæ»áÓÐÓÅ»¯£¬´Ë´¦Õë¶Ô1ÖеÄÇé¾°ÌÖÂÛ¡£1ÖÐÇé¾°·¢ÉúʱÈçÏÂͼ£º

ͼ2-4 ʹÓÃFragmentÔì³É½çÃæ¶¯Ì¬ÐÔµÄÇé¾°
¡¡¡¡ÉÏͼÖÐFragmentA,FragmentB,FragmentCµÄ¶¥²ãÊÓͼ¿Ø¼þÈ«²¿ÊÇLinearLayout£¨Í¬ÀàÐÍ£©£¬´ËʱÕâÈý¸öFragment¼ÓÈëµÄ˳Ðò½«Ôì³ÉViewPathÔÚ´Ë´¦¸÷ÖÖ²»Ò»Ö£¬´Ó¶øµ¼ÖÂViewPathÔÚ¶¯Ì¬±ä»¯Ç°ºó²»Äܱ£³ÖÒ»Ö£¨ÈçÇ°Ãæ£ºViewTree¶¯Ì¬±ä»¯Ç°ºó¿Ø¼þ3ViewPathµÄ±ä»¯Ëùʾ£©¡£
ÓÅ»¯:
ÔÚViewPath½ÚµãÖУ¬Ê¹ÓÃFragmentµÄÃû×ÖÌæ»»ViewType
¡¡¡¡ÓÅ»¯ºó,·¢Éúͼ2-4Ëùʾ½çÃæ²¼¾Ö¶¯Ì¬±ä»¯Ê±£¬¿Ø¼þ3µÄViewPath±ä»¯Îª£º
ViewTree¶¯Ì¬±ä»¯Ç°: RootView/FragmentB[0]
indexΪ0±íʾ´Ë½ÚµãÊÇÐֵܽڵãÖеÚÒ»¸öFragmentB ViewTree¶¯Ì¬±ä»¯ºó: RootView/FragmentB[0] |
¡¡¡¡ÈçÉÏ£¬´Ë´ÎÓÅ»¯Ê¹µÃ£¬ÔÚ¶¥²ãÊÓͼViewTypeÏàͬµÄFragment¶¯Ì¬Ìí¼Ó£¯É¾³ýµ½ViewTreeʱ£¬ViewPathÔڱ仯ǰºó±£³ÖÒ»Ö¡£
c. Õë¶Ô¿É¸´ÓÃViewµÄÓÅ»¯
Çé¾°
¡¡¡¡ÒÔ×ʹÓõÄListViewΪÀý£¬¼ÙÉèÓÐÒ»ListViewÂúÆÁÖ»ÏÔʾ3¸öÌõÄ¿£¬ÄÇô´ËListView¿ÉÄÜÖ»ÓÐ3¸ö×ӿؼþ£¨ItemView£©,¶ø´ËListViewÉÏ»¬Ö®ºó¿ÉÒÔÏÔʾ100ÏîÄÚÈÝ¡£
¡¡¡¡Õâ3¸öItemViewÓë100ÏîÄÚÈÝÊÇÒ»¶Ô¶àµÄ¶ÔÓ¦¹ØÏµ£¬¶øÇÒÓ³Éä²¢ÎÞ¿É¿¿¹æÂÉ¡£
¡¡¡¡´Ëʱ£¬ÎÒÃÇÏ£ÍûViewPath¿ÉÒÔÇø·ÖÕâ100ÏîÏÔʾµÄÄÚÈÝÌõÄ¿£¬¶ø·Ç½ö½öÇø·Ö3¸öItemView¡£
ÉÏÃæÇé¾°ÖеÄÎÊÌâ¿ÉÓÃÏÂͼ±í´ï£º

ͼ2-5 ¿É¸´ÓÃViewµÄViewPathÇø·ÖÐÔÓÅ»¯
¡¡¡¡ÈçÉÏͼÖУ¬ÄÚÈÝÌõÄ¿1ºÍ4¶¼ÊÇÓÃitemView1À´³ÊÏֵ쬰´ÕÕ֮ǰµÄViewPath¶¨Ò壬ͼ2-5Öи÷¸öÄÚÈÝÌõÄ¿µÄViewPathÈçÏ£º
ÄÚÈÝÌõÄ¿1: ListView/ItemView[0]
indexΪ0±íʾ´Ë½ÚµãÊÇÐֵܽڵãÖеÚÒ»¸öItemView ÄÚÈÝÌõÄ¿4: ListView/ItemView[0] ÄÚÈÝÌõÄ¿2: ListView/ItemView[1] ÄÚÈÝÌõÄ¿3: ListView/ItemView[2] |
¡¡¡¡¿ÉÒÔ¿´³öÄÚÈÝÌõÄ¿1ºÍ4µÄViewPathÇø·Ö²»¿ª¡£´ËÖÖÎÊÌâ¿ÉÒÔ×ܽáΪ£º
ÏÔʾÄÚÈÝÓëViewTreeÖеĿؼþ²»ÊÇÒ»Ò»¶ÔÓ¦µÄÇé¿öÔì³É»ùÓÚViewTreeµÄViewPathÇø·Ö¶È²»¹»
1.¿É¸´ÓÃView,±ÈÈ磺ListView,RecyclerView,SpinnerµÈ£¬³ÊÏÖ³öÀ´×ÓViewµÄÊýÄ¿ºÍʵ¼Ê×ÓViewµÄÊýĿδ±ØÒ»ÖÂ
2.ViewPagerÉèÖûº´æÒ³ÃæÊýΪ1£¬µÚ¶þÒ³ÏÔʾʱ£¬µÚ¶þ¸öÒ³Ãæ¶¥¼¶ViewÆäʵÊÇViewPagerµÄµÚÒ»¸öChildView¡£´ËÖÖÇé¿öÒ²»áÔì³ÉÏÔʾÄÚÈÝ£¨µÚ¶þÒ³£©ÓëViewTreeÖеĿؼþ£¨µÚÒ»¸öChildView£©²»¶ÔÓ¦µÄÇé¿ö¡£
Òò´ËÎÒÃǶÔÓÚViewPath×÷ÈçÏÂÓÅ»¯£º
ViewPath½ÚµãµÄindexÈ¡ÄÚÈݵĵڼ¸Ï¶ø·ÇµÚ¼¸¸öItemView¡£
ÓÅ»¯£º
ÓÅ»¯ºóͼ2-5Öи÷¸öÄÚÈÝÌõÄ¿µÄViewPathÈçÏ£º
ÄÚÈÝÌõÄ¿1: ListView/ItemView[0]
indexΪ0±íʾ´Ë½ÚµãÊÇListViewÏÔʾµÄ
µÚÒ»¸öÄÚÈÝÌõÄ¿ ÄÚÈÝÌõÄ¿4: ListView/ItemView[3] ÄÚÈÝÌõÄ¿2: ListView/ItemView[1] ÄÚÈÝÌõÄ¿3: ListView/ItemView[2] |
¿É¼û£¬Ö®Ç°ViewPathÎÞ·¨Çø·ÖµÄÄÚÈÝÌõÄ¿1ºÍ4ÏÖÔÚ¿ÉÒÔÇø·Ö¿ªÁË¡£¸÷Öֿɸ´ÓÃViewÈ¡ÄÚÈݵĵڼ¸ÏîµÄ´úÂë·½·¨ÈçÏ£º
ListView,SpinnerµÈAdapterVie
ListView.getPositionForView(itemView) RecyclerView-
-RecyclerView.getChildAdapterPositi
(itemView) ViewPager
------ViewPager.getCurrentItem() |
d. ViewPathÆðµãÓÅ»¯
Ò»¸öʵ¼ÊÖеÄViewPathÈçÏ£º
DecorView/LinearLayout[0]/Fram
eLayout[0]/
ActionBarOverlayLayout[0]/Content
FrameLayout[0]
/FrameLayout[0]/LinearLayout[0]
/ViewPager[0]/
ButtonFragment[0]/AppCompatButton[0] |
¡¡¡¡ÉÏÃæµÄ¡°ContentFrameLayout[0]¡±Õâ¸ö½Úµã´ú±íµÄ¾ÍÊÇContentView£¬³ÌÐòÔ±ÔÚxml»òÕß´úÂëÀïÃæ¹¹½¨µÄView¶¼ÔÚContentViewÖС£
¡¡¡¡´ÓDecorViewµ½¡°ContentFrameLayout[0]¡±µÄÕâÒ»¶ÎPathÊÇAndroidϵͳFramework²ã¾ö¶¨µÄ,ÀíÂÛÉÏÓ¦¸ÃÊÇÒ»Öµģ¬µ«ÊÇÓÉÓÚË鯬»¯µÈÔÒò¿ÉÄÜViewPathµÄÕâÒ»¶Î·¢Éú±ä»¯£®ÔÚʵ¼ùÖУ¬ÎÒÃÇÒ²·¢ÏÖȷʵÓÐһЩRom·¢ÉúÁË´ËÀàÇé¿ö£¬µ«ÊDZÈÂʺÜС£®
¡¡¡¡ÎªÁËÆÁ±ÎÕâÖÖ¿ÉÄÜÔì³Éͬһ¸öViewÔÚ²»Í¬É豸ÉϲúÉúViewPath²»Í¬µÄÇé¿ö£¬ViewPathµÄÆðµã¶¨ÒåÔÚContentView±È½ÏºÃ£®ÈçÉÏÃæµÄViewPath¿ÉÓÅ»¯Îª£º
ContentView/FrameLayout[0]/LinearLayout[0]/
ViewPager[0]/ButtonFragment[0]/AppCompat
Button[0]#mybutton |
×ö·¨£º
¡¡¡¡¹¹Ôìÿһ¸öViewPath½Úµãʱ¿ÉÒÔÈ¡view.getId()£¬¿´¿´idµÄpackageId²¿·ÖÊDz»ÊÇϵͳµÄ£¨ÏµÍ³×ÊÔ´idÒÔ16½øÖƵÄ0x01,0x00¿ªÍ·£©£¬Èç¹ûÊÇ£¬Éú³ÉViewPathʱÆÁ±ÎÕâ¶Î¼´¿É£®
Èý¡¢Ò³ÃæµÄ»®·Ö
3.1 ºÏÀí»®·ÖÒ³ÃæµÄÖØÒªÐÔ
¡¡¡¡Ò³ÃæÔÚAndroidÖжÔÓ¦ÓÚActivityºÍ²¿·ÖFragment(±ÈÈçºÜ¶àappÊ×Ò³¶àtabµÄÉè¼Æ£¬Èôÿ¸ötabÊÇʹÓÃFragmentʵÏÖµÄ,ÄÇôÕâÖÖtabÒ»°ã¿´×÷Ò»¸öÒ³Ãæ)£®Ò³ÃæµÄ»®·ÖºÜÖØÒª£¬ÒòΪÁ½µã£º
¶ÔÓÚÒ³Ãæ£¬ÐèÒª»ñÈ¡Show/HideÁ½¸öʱ»ú£¬ÔÚ´Ëʱ»úÉϱ¨Ò³ÃæShow/Hideʼþ,·ÇÒ³ÃæÔò²»ÐèÒª
Ò³ÃæµÄ»®·Ö¹ØÏµ×ÅÓû§½»»¥Ê¼þµÄËùÊô£¬ÀýÈ磬°´Å¥µã»÷ʼþÉϱ¨¸ñʽÈçÏ£º

¡¡¡¡±í¸ñÖеģ¢ËùÊôÒ³Ãæ£¢¼´±íʾ´Ë´Î°´Å¥µã»÷ʼþ·¢ÉúÔÚMainActivityÖУ®½«½»»¥Ê¼þ¹éÊôÓÚÒ³ÃæÕâÑù¶ÔºóÃæÎÞÂÛÊǽøÐз¾¶·ÖÎö»¹ÊÇͳ¼Æ¿Ø¼þµã»÷Á¿·Ö²¼¶¼ÓкܴóµÄºÃ´¦£®
3.2 AndroidÖеÄÒ³Ãæ
¡¡¡¡AndroidÖÐͨ³£ÐèÒª¿´×÷Ò³ÃæµÄÓÐActivityºÍFragment(¶ÔÓÚÏñÈ«ÆÁDialog»òÕßÈ«ÆÁµÄViewÔݲ»¿¼ÂÇ)£®¶ÔÓÚActivity£¬ÉϽÚÖÐÌáµ½µÄÁ½µã¶¼ºÜÈÝÒ×°ìµ½.
a. ActivityÒ³Ãæ
´ÓApplication.ActivityLifecycleCallbacksµÄonActivityResumed£¯onActivityPausedÕâÁ½¸ö»Øµ÷·½·¨¾Í¿ÉÒÔ·Ö±ðµÃµ½ActivityÒ³ÃæShow/HideµÄʱ»ú£¬²¢ÔÚ´Ëʱ»úÉϱ¨ÏàÓ¦Ò³ÃæÊ¼þ
½»»¥¹éÊôµÄActivityÒ³Ãæ¿ÉÒÔͨ¹ýContextÇáËÉ»ñµÃ£¬ÀýÈçÉÏÆªÎÄÕÂ<<Android
AOPÖ®×Ö½ÚÂë²å×®>>Ìáµ½£¬µ±°´Å¥µã»÷ʱ£¬»á´¥·¢ÎÒÃDzå×®µÄ´úÂ룺
Monitor.onViewClick(view) |
b. fragmentÒ³Ãæ
¡¡¡¡Ïà¶ÔÓÚActivity£¬½«Ä³Ð©Fragment¿´×÷Ò³ÃæµÄÂß¼¾ÍÒªÉÔ΢¸´ÔÓһЩÁË£®ÕâÀïÃæÉæ¼°ÏÂÃæ¼¸¸öÎÊÌ⣺
ÄÄЩFragment¿ÉÒÔÐèÒª¿´×÷Ò³Ãæ£¿
¡¡¡¡ÕâÊÇÐèÒªÈ˹¤¾ö²ßµÄ£¬»úÆ÷×ö²»ÁËÕâ¸ö¾ö¶¨£®
¡¡¡¡Ä¿Ç°ÎÒÃÇÕâ¸öÈ˹¤¸ÉÔ¤Êǽ»¸øÓû§Ñо¿ÍŶӣ¬ËùÓÐFragment½ØÍ¼µÈÐÅÏ¢¾ùչʾÔÚÆ½Ì¨ÉÏ£¬ÓÉÓÃÑÐͬÊÂÑ¡ÔñÐèÒª¿´×÷Ò³ÃæµÄÄÇЩ£¬ÓÃÑÐÑ¡ÔñµÄ½á¹û½«×Ô¶¯»¯ÅäÖõ½SDKÖУ®
ÈçºÎµÃµ½FragmentÒ³ÃæµÄShow/HideÒ³ÃæÊ¼þ£¿
¡¡¡¡ÓÉÓÚfragmentʹÓó¡¾°±È½Ï¶àÑù£¬µ¥µ¥ÒÀ¿¿OnResume/OnPauseÁ½¸ö»Øµ÷±íʾfragment
Show/HideÊDz»×¼È·µÄ,±ÈÈ磺
³¡¾°Ò»£º
¡¡¡¡Ê×Ò³Ò»¸öActivity³ÐÔØ¶à¸öFragment TabµÄÇé¿ö£¬´Ëʱtab¼äÇл»²¢²»»á´¥·¢FragmentµÄOnResume/OnPause£®´¥·¢µÄ»Øµ÷º¯ÊýÊÇonHiddenChanged(boolean
hidden)
³¡¾°¶þ£º
¡¡¡¡Ò»¸öViewPager³ÐÔØ¶à¸öÒ³ÃæµÄFragmentʱ
¡¡¡¡¡¡¡¡a.µ±µÚÒ»¸öFragment1ÏÔʾʱ£¬ËäÈ»µÚ¶þ¸öFragment2´ËʱÉÐδÏÔʾ£¬µ«ÊÇFragment2µÄOnResumeÈ´ÒÔ¼°Ö´ÐУ¬´¦ÓÚresumedµÄ״̬£®
¡¡¡¡¡¡¡¡b.ViewPagerÒ³ÃæÇл»OnResume/OnPause/onHiddenChanged¾ùδ´¥·¢£¬´¥·¢µÄ»Øµ÷ÊÇsetUserVisibleHint
¡¡¡¡´ËʱÅжÏFragment¡¡Show/HideÓ¦¸ÃÓÃsetUserVisibleHint£¬¶ø·ÇOnResume/OnPause
¡¡¡¡ÈçǰһƪÎÄÕÂXXX,ËùÊö£¬ÎÒÃÇͨ¹ý²å×®µÄ·½Ê½Hookµ½ÁËfragmentµÄÈçÏÂÉúÃüÖÜÆÚº¯ÊýÓÃÓÚ°ü×°³ÉΪShow/Hideʼþ£º
onResume() onPause() onHiddenChanged(boolean hidden) setUserVisibleHint(boolean isVisibleToUser) |
ʹÓÃÕ⼸¸ö»Øµ÷°ü×°³ÉÊÊÓÃÓÚ¸÷ÖÖÇé¾°µÄFragmentShow/HideʼþµÄα´úÂëÈçÏ£º
//´ÓViewÖÐÀûÓÃcontext»ñÈ¡ËùÊôActivity
µÄÃû×Öpublic static String getActiv
ityName(View view) { Context context = view.getContext(); if (context instanceof Activity) { //context±¾ÉíÊÇActivityµÄʵÀý return context.getClass().ge
tSimpleName().; } else if (context instanceof
ContextWrapper) { //ActivityÓпÉÄܱ»ÏµÍ³£¢×°ÊΣ¢
£¬¿´¿´context.
baseÊDz»ÊÇActivity Activity activity = getActivity
FromContext
Wrapper((ContextWrapper) context); if (activity != null) { return activity.getClass().
getSimpleName(); } else { //Èç¹û´Óview.getContext()ÄÃ
²»µ½ActivityµÄ
ÐÅÏ¢£¨±ÈÈçviewµÄcontextÊÇApplication£©
,Ôò·µ»Øµ±
ǰջ¶¥ActivityµÄÃû×Ö return currentActivityName; } } return ""; } |
ÈçºÎ½«FragmentÄÚ²¿µÄ½»»¥¹éÊôµ½FragmentÒ³Ãæ£¬Ò²¾ÍÊÇ˵ÈçºÎÔÚ½»»¥·¢Éúʱ´ÓviewʵÀýÄõ½FragmentÒ³ÃæµÄÃû×Ö£¨Ïñ֮ǰÄõ½ActivityÒ³ÃæÃû×ÖÒ»Ñù£©£¿
¡¡¡¡view¿ÉÒÔͨ¹ýcontextÄõ½ActivityµÄÐÅÏ¢£¬µ«ÊÇȴûÓÐ;¾¶Äõ½fragmentµÄÒýÓá£ÄÇô£¬µ±Ä³¸öView½»»¥·¢Éú£¬ÎÒÃÇÓÖÐèÒª»ñÈ¡FragmentÒ³ÃæÃû×ÖµÄÇé¿öÏ£¬ÎÒÃÇÖ»ÄÜÊÂÏȽ«FragmentÒ³ÃæÃûдÈë´ËViewµÄÊôÐÔÖС£
¡¡¡¡×ö·¨´óÖÂÈçÏ£º
¡¡¡¡¡¡¡¡a. °´ÕÕǰһƪÎÄÕÂxxxÀïÃæµÄ·½·¨£¬ÔÚFragment.OnCreateView·½·¨µÄ½áβ²å×®£¬Äõ½returnµÄview£¨¼´Îª´ËFragmentµÄ¶¥²ãÊÓͼ£©
¡¡¡¡¡¡¡¡b. ÅжϴËFragmentÊÇ·ñ±»Ö¸¶¨ÎªFragmentÒ³Ãæ,Èç¹ûÊÇ£¬ÏÂÒ»²½
¡¡¡¡¡¡¡¡c.±éÀúÒÔFragmentµÄ¶¥²ãÊÓͼΪ¸ù½ÚµãµÄViewTree, ½«FragmentÃûÉèÖõ½´ËViewTreeµÄÿһ¸öviewÉÏ¡£ÉèÖ÷½·¨ÈçÏÂËùʾ£º
view.setTag(0xff000001, fragmentName);
×¢Ò⣺ViewÀàÓÐÁ½¸öÃûΪsetTagµÄ·½·¨£º
public void setTag(final Object tag)
¡¡¡¡´Ë·½·¨£¬ÀàÄÚ²¿ÓÃÒ»Object¶ÔÏó´æ´¢tag£¬protected Object mTag = null;¡£listAdapterÖг£ÓÃÓÚÉèÖÃholder¡£ÎÒÃÇ´Ë´¦ÓõIJ»ÊÇÕâ¸ö£¬²»»áÓÚ´ËÓ÷¨³åÍ»
view.setTag(0xff000001, fragmentName); |
¡¡¡¡´Ë·½·¨£¬ÀàÄÚ²¿ÓÐһϡÊèÊý×é´æ´¢tag£¬private SparseArray<Object>
mKeyedTags;
¡¡¡¡tagµÄkey¹Ù·½ÍƼö×ÊÔ´id£¬Òò´ËÎÒÃÇ¿ÉÒÔÑ¡ÓÃÀàËÆ0xff000001Ö®ÀàµÄappÓò»µ½µÄ×ÊÔ´id½øÐÐtag´æ´¢ÒÔ±ÜÃâ³åÍ»¡£
¡¡¡¡¡¡¡¡d. µ±ÐèҪʹÓÃFragmentÃûʱ£¬Èçϵ÷Óü´¿É»ñµÃ£º
public void setTag(final Object tag) |
3.3 Ò³ÃæÃû×é³É
Ç°Ãæ½²Á˽«½»»¥Ê¼þ£¨±ÈÈçµã»÷ʼþ£©¹éÊôµ½Ä³Ò»¸öÒ³ÃæµÄ·½·¨ÊÇ£º
ÔÚ½»»¥Ê¼þÖÐÉèÖÃÒ»¸ö×ֶΣ¬ÖµÎªÒ³ÃæÃû³Æ¡£
Ò³Ãæ¿ÉÒÔÊÇActivity»òÕßActivity³ÐÔØµÄFragment£¬ÎÒÃǵÄÒ³ÃæÃû³Æ×é³ÉÈçÏ£º
public void setTag(int key, final Object tag) |
˵Ã÷ÈçÏ£º
1.¡°[]¡±ÄÚµÄ×é³É²¿·ÖÊÇ¿ÉÑ¡µÄ£¬¿ÉÄÜÓпÉÄÜûÓС£ÁíÍ⣬¸÷¸ö×é³É²¿·ÖÖ®¼äÓзָô·û·Ö¸î¡£
2.Ò³ÃæÃû×é³ÉÖУ¬ActivityµÄÃèÊö£¨ÀàÃû/±ðÃû£©ÊǵÚÒ»²ã£¬FragmentµÄÃèÊö£¨ÀàÃû/±ðÃû£©Êǵڶþ²ã
3.±ðÃûµÄ³öÏÖÊÇΪÁ˽â¾öµ¥´¿ÒÀÀµÀàÃûÎÞ·¨¾«È·Çø·ÖÒ³ÃæµÄijЩÇé¿ö£¬±ÈÈ磺
ÔÚij¸öµçÉÌÓ¦ÓÃÖУ¬¡°ÉÌÆ·ÏêÇéÒ³¡±£¨Í¬Ò»¸öActivity£©ÓÃÓÚչʾ¸÷ÖÖÉÌÆ·£¨iphone,µçÊӵȣ©£¬Èç¹ûÐèÒª°Ñ¡°²»Í¬ÉÌÆ·µÄÉÌÆ·ÏêÇéÒ³¡°Çø·Ö³É²»Í¬Ò³ÃæÀ´Í³¼ÆpvµÈÖ¸±êµÄ»°£¬ÐèÒªÉèÖñðÃû£¬È磺
¶ÔÓÚ±ðÃûµÄÉèÖã¬ÐèÒª³ÌÐòÔ±ÔÚÒµÎñ´úÂëÀïÃæ£¨ÈçActivity.OnCreate,Fragment.onCreateµÈ£©ÏÔʽÉèÖÃ.
ËÄ¡¢ÎÞÐèÂñµãÇáËÉÊÕ¼¯¶¨ÖƵÄÒµÎñÊý¾Ý
4.1 ÅäÖÃʾÀý
¡¡¡¡Ö®Ç°Ìáµ½¹ý£¬Êý¾ÝÊÕ¼¯SDK¿ÉÒÔͨ¹ýÅäÖÃÏ·¢¼´Ê±ÊÕ¼¯¶¨ÖƵÄÊý¾Ý£¬ÄÇôÔÚAndroid¶ËÕâ¸öÊÇÔõô×öµ½µÄÄØ£¿
Ê×ÏÈ£¬¿´Ò»ÏÂÏ·¢µÄÅäÖÃÑùÀý:
ÉÏÃæÀý×Ó·Òë³ÉÊý¾ÝÐèÇó¾ÍÊÇ£º
1. µ±Ò³Ãæ(MainActivity)
2. ÖеĿؼþ£¨DecorView/.../ViewPager [0]/ ButtonFragment[0] / AppCompatButton[0]£©
3. ·¢Éúµã»÷ʼþ£¨ViewClick£©Ê±
4. °´ÕÕ·¾¶£¨this.context.demoList[5]£©È¡³öÊý¾Ý
5. ²¢¸½¼Óµ½µã»÷ʼþÉÏÃæÒ»ÆðÉϱ¨
°´ÕÕÕâ¸öÃèÊö£¬ÎÒÃÇ»¹¿ÉÒÔÃèÊöÈçϵȵȸ÷ÖÖÊý¾ÝÐèÇó£º
µ±(Ä³Ò³Ãæ)·¢Éúʼþ£¨Show£©Ê±£¬°´ÕÕ·¾¶£¨xxx£©È¡³öÊý¾Ý£¬²¢¸½¼Óµ½Ò³ÃæShowʼþÉÏÃæÒ»ÆðÉϱ¨
×ܽáÏÂÃèÊöµÄ×é³É²¿·Ö£¬ÈçÏ£º

4.2 ÎÞÂñµãÊÕ¼¯Á÷³Ì
¡¡¡¡ÉϽÚչʾÁËÓÃÓÚÎÞÂñµã¶¨ÖÆÒµÎñÊý¾ÝÊÕ¼¯µÄÅäÖã¬ÄÇôSDKÊÕµ½ÕâÑùµÄÒ»·ÝÅäÖÃÈçºÎ×îÖÕ°ÑÏëÒªµÄÊý¾ÝÊÕ¼¯ÉÏÀ´ÄØ£¿
1.²½ÖèÒ»£º²úÉúÔʼʼþ¡£±ÈÈçµã»÷ʱÊÕ¼¯£¬µ±µã»÷ʱ»á´¥·¢ÎÒÃDzå×®µÄ´úÂ룬²¢Éú³ÉÔʼµÄµã»÷ʼþ
Monitor.onViewClick(view) |
2.²½Öè¶þ£ºÆ¥ÅäÅäÖÃ
ÔÚonViewClick·½·¨ÖÐÆ¥ÅäÏ·¢µÄÅäÖÃÐÅÏ¢£¬¿´¿´Page,ViewPathÊÇ·ñÓ뵱ǰviewÆ¥Å䣬EventTypeÊÇ·ñÓ뵱ǰʼþÀàÐÍÆ¥Å䣬ÈôÆ¥ÅäÔò½øÐÐÏÂÒ»²½
×¢£ºViewPathµÄÆ¥Åä¿ÉÒÔÓо«È·Æ¥ÅäºÍÄ£ºýÆ¥Å䣬¾«È·Æ¥Åäʱһ¸öViewPath¾«È·Æ¥ÅäΨһһ¸ö¿Ø¼þ£®Ä£ºýÆ¥Åäʱһ¸öViewPath¿ÉÆ¥Åä¶à¸ö¿Ø¼þ£¬ÀýÈç¿ÉÒÔÓÃÓÃÒ»¸öViewPathÄ£ºýÆ¥ÅäÒ»¸öÁбíÖеÄËùÓÐÌõÄ¿£®
3.²½ÖèÈý£º°´ÕÕÊý¾Ý·¾¶£¨DataPath£©Öð¼¶·´ÉäÄõ½Ä¿±êÊý¾Ý£¬²¢½«ÕÒµ½µÄÊý¾Ý¸½ÔÚÔʼµÄµã»÷ʼþÉϽøÐÐÉϱ¨¡£
4.3 Êý¾Ý·¾¶£¨DataPath£©
¡¡¡¡ÉÏÊö²½ÖèÈý½øÐÐÊý¾ÝÊÕ¼¯Ö÷ÒªÊǰ´ÕÕDataPathµÄÃèÊö½øÐУ¨ÀýÈçʾÀýÖÐÌáµ½µÄ£¢this.context.demoList[5]£¢£©£¬DataPathÊÇÒ»ÖÖÎÒÃÇÓÃÓÚÊÕ¼¯¶¨ÖÆÊý¾Ý¶ø¶¨ÒåµÄÒ»ÖÖDSL£®º¬ÒåÈçÏ£º
a. º¬Òå
DataPath: Ö¸ÏòÒªÊÕ¼¯µÄÄ¿±êÊý¾ÝµÄÒ»ÌõÒýÓ÷¾¶£¬½âÎö´Ë·¾¶²¢Öð¼¶·´Éä×îÖÕÄõ½Ä¿±êÊý¾Ý£®
¡¡¡¡DataPathд·¨ÖеÄһЩ¹Ø¼ü×Ö(·û)£º

b. Ó¦ÓÃʾÀý
¡¡¡¡ÏÂÃæÓÃÁ½¸öÀý×Ó˵Ã÷ÈçºÎ´ÓDataPathÕÒµ½Ä¿±êÊý¾Ý£®

ͼ£´-1 DataPathʾÀý
ʾÀý£±£ºÁбíÊý¾Ý»ñÈ¡
¡¡¡¡ÉÏͼÖÐÏÔʾÊÇÒ»¸öÁÐ±í£¬ºì¿òÖÐÊÇÁбíµÄµÚÒ»¸öÌõÄ¿£®ÄÇô£¬Èç¹ûÎÒÃÇÏëÒªÔÚÁбíÖÐÌõÄ¿µã»÷ʱ£¬½«ÁбíչʾµÄ½»Òׯ·ID(»òÕߺÏ×÷·½ID)µÈ²»ÔÚ½çÃæÉÏÏÔʾ¶øÓÖ´æÔÚÓÚÄÚ´æÖеÄÊý¾Ý¸úËæµã»÷ʼþÉϱ¨£®´Ë´¦DataPath¸ÃÔõôд£¿
¡¡¡¡DataPath½âÊÍ£º
Æðµã¶¨Îª£¢item£¢,Ôò±íʾ´Ó´ËListView(»òÕßRecylerView)°ó¶¨µÄAdapterÖе±Ç°Êý¾ÝitemΪÆðµãÈ¡Êý¾Ý£®
¼ÙÉè´ËListView°ó¶¨µÄAdapterÈçÏ£º
public class DemoAdapter extends BaseAdapter { private ArrayList<DataItem> mDataItems; ...... } |
Ôò´Ë´¦"item"´ú±íµÄ¾ÍÊÇmDataItems[x] (x±íʾµ±Ç°±»µã»÷ÌõÄ¿µÄitemId)
2.£¢productId£¢ÊÇmodelÀàDataItemÖбíʾ£¢½»Òׯ·ID£¢µÄ×Ö¶ÎÃû³Æ£®
¡¡¡¡Í¨¹ýDataPath»ñÈ¡Êý¾Ý£º
µ±µÚxÌõÄ¿±»µã»÷ʱ£¬Èç¹û·¢ÏÖÓÐÆ¥ÅäµÄÅäÖ㬶ÔÓÚÆðµãΪ"item"µÄDataPath£¬ÏÈͨ¹ýview.getParentÕÒµ½ÉϲãListViewʵÀý£¬È»ºóͨ¹ýlistView.getAdapter()»ñµÃ°ó¶¨µÄAdapterʵÀý£¬×îºóͨ¹ýAdapter.getItem(ListView.getPositionForView(itemView))µÃµ½Êý¾ÝÖеÚx¸öitem,¼´mDataItems[x]
·´Éä»ñÈ¡mDataItems[x]ÖеÄproductId×ֶΣ¬¼´¿ÉµÃµ½µÚx¸öÌõÄ¿µÄ£¢½»Òׯ·ID£¢,½«´ËID¸úËæµÚxÌõÄ¿µÄµã»÷ʼþ½øÐÐÉϱ¨¼´¿É£®
ʵÀý£²£º½çÃæÊý¾Ý»ñÈ¡
¡¡¡¡Í¬Ñùʱͼ4-1Ëùʾ£¬¼ÓÈëÎÒÃÇÏëÔÚÁбíÖÐÌõÄ¿µã»÷ʱ£¬½«ÌõÄ¿ÖÐչʾµÄ"×îмÛ"¸úËæµã»÷ʼþÉϱ¨£®´Ë´¦DataPath¸ÃÔõôд£¿
¡¡¡¡ºì¿òËùʾViewTree×ÓÊ÷ÈçÏ£º

ͼ4-2 ÁбíItem ViewTree×ÓÊ÷½á¹¹
¡¡¡¡ÈçÉÏͼ£¬Ñ¡Öв¿·ÖÊÇÁбíµÄItemView£¨RelativeLayout£©,¿É¼û"×îмÛ"ÊÇÓÉindexΪ2µÄTextViewËùչʾ£¬Óɴ˿ɵã¬ÁбíÖÐÌõÄ¿µã»÷»ñÈ¡"×îмÛ"Êý¾ÝµÄDataPathÈçÏ£º
¡¡¡¡DataPath½âÊÍ£º
1.ÆðµãΪ£¢this£¢,±íʾµ±Ç°±»µã»÷µÄviewʵÀý£¨Í¼4-2Öб»Ñ¡ÖеÄRelativeLayout£©
2."childAt(2)"±íʾRelativeLayout.getChildAt(2),µÃµ½Í¼4-2ÖÐindexΪ£²µÄTextView
3."mText" ±íʾȡ³ö²½Ö裲Öеõ½TextViewʵÀýµÄmText×ֶΣ¨TextView¿Ø¼þÏÔʾµÄÎÄ×ÖÄÚÈÝ´æ´¢ÔÚmText×Ö¶ÎÄÚ£©
4.½«È¡³öµÄ½çÃæÉÏÏÔʾµÄ"×îмÛ"Êý¾ÝÌí¼Óµ½Ôʼµã»÷ʼþÖУ¬Ò»ÆðÉϱ¨£®
c. DataPath×¢ÒâÊÂÏ
£±£®»ìÏý£®
¡¡¡¡ÓÉÓÚDataPath±¾ÖÊÉÏÃèÊöµÄʱÄÚ´æÖеģ¢ÒýÓ÷¾¶£¢£¬²¢ÇÒ°´ÕÕDataPathÈ¡Êý¾ÝʱÓÃÁË·´ÉäµÄ·½·¨£¬Òò´ËDataPathÓ¦¸ÃÃèÊöµÄÊÇ»ìÏýÖ®ºóµÄ£¢ÒýÓ÷¾¶£¢£®
¡¡¡¡ËäÈ»DataPath¿ÉÄÜÊܵ½»ìÏýµÄÓ°Ï죬µ«ÊÇ
* ÓÃÓÚ´æ´¢Êý¾ÝµÄmodelÀàͨ³£ÊDz»±»»ìÏýµÄ£®ÈçÎÒÃÇ֮ǰµÄitem¹Ø¼ü×ÖÖ±½Ó½«ÆðµãÉèÖÃΪÁбíÌõÄ¿µÄmodelÀà¶ÔÏ󣬲»ÊÜ»ìÏýÓ°Ï죮
* ͨ¹ý¹Ø¼ü×Öparent£¯childAt(x)¿ÉÒÔÔÚÊÓͼµÄÒýÓÃÖв»ÊÜ»ìÏýÓ°Ïì
* ½Ó¿ÚµÄ·½·¨Í¨³£²»ÊÜ»ìÏýÓ°Ï죮Òò´ËÔÚDataPathÖжàÓýӿڷ½·¨µ÷ÓÃ
¡¡¡¡Òò´Ë¿ª·¢ÔÚÅäÖÃDataPathʱӦ¾¡Á¿ÓÃÉÏÊö²»±»»ìÏýÓ°ÏìµÄ×ֶμ°·½·¨£®µ«ÊÇ£¬Èç¹ûÕæµÄÓõ½ÁË»ìÏý¹ýµÄ×Ö¶ÎÔõô°ì£®ÎÒÃǵķ½°¸ÊÇ£º
Êý¾Ý±¨¾¯
¡¡¡¡±ÈÈç°æ±¾£±ÉÏÅäÖõÄDataPath "a.b",ÔÚÉý¼¶Ð°汾£²ºó²»ÔÙÊÊÓã¬Ôòа汾£²°´ÕÕ£¢a.b£¢ÊÕ¼¯Ê±½«ÊÕ¼¯²»µ½£¬²úÉú±¨¾¯ÐÅÏ¢µ½ºǫ́£®ºǫ́ÊÕµ½´óÁ¿´ËÖÖÐÅÏ¢»áÌáÐÑ¿ª·¢ÎªÐ°汾ÅäÖÃÊÊÓÃа汾µÄDataPath£®
£²£®´úÂë±ä»¯µ¼ÖÂÒýÓ÷¾¶±ä»¯£¬´Ó¶øÖÂʹ֮ǰÅäÖõÄDataPathʧЧ£®
¡¡¡¡Óë´úÂëÖÐÂñµãÏà±È£¬ÏßÉÏÅäÖýøÐÐÊÕ¼¯Êý¾ÝÓë´úÂëµÄ±ä»¯ÊDz¢Ðеģ¬Î޹صģ®Õâ¾ÍÓпÉÄÜÔì³ÉÔÓдúÂëÐ޸ĵ¼ÖÂDataPathʧЧ£®ÆäʵÈç¹û¿Í»§¶Ë¼Ü¹¹Éè¼ÆºÏÀí£¬¹¦Äܵü´ú¸ü¶àÊÇÔÚ½øÐдúÂëµÄÀ©Õ¹£¬¶ø·ÇÐ޸ģ¬ÕâÖÖµ¼ÖÂDataPathʧЧµÄÇé¿öÓ¦¸Ã»á´ó´ó½µµÍµÄ£®
¡¡¡¡µ«ÊÇÎÞÂÛÈçºÎ£º
ÅäÖõÄDataPath°ÚÍѲ»ÁËÓë°æ±¾µÄÏà¹ØÐÔ
¡¡¡¡¶ÔÓÚ´ËÖÖÎÊÌâÎÒÃÇÒÀÈ»ÊÇͨ¹ýÇ°ÃæÌáµ½µÄ£¢Êý¾Ý±¨¾¯£¢½øÐÐ¼à¿Ø¼°±ÜÃâµÄ£®
Îå¡¢½áÓï
¡¡¡¡×ÛÉÏ£¬±¾ÎĽéÉÜÁËÊý¾ÝÊÕ¼¯Âß¼ÖУ³¸ö±È½Ï¹Ø¼üµÄµã£¨ViewID/Page/DataPath£©£¬½áºÏÉÏһƪÎÄÕµÄ(AOPÔÀí)£¬Android¶ËÎÞÂñµãÊý¾ÝÊÕ¼¯¼¼ÊõÉϱȽϹؼüµÄµã½ÔÒÔ×ܽáÍê±Ï£®
¡¡¡¡µ±È»ÊµÏÖSDK¹ý³ÌÖÐÔâÓö¹ýºÜ¶à±È½ÏÓÐÒâ˼µÄ¼¼ÊõÎÊÌ⣬ºóÐøÒ²»áÂ½Ðø½øÐÐÕûÀí£®
|