以下のようなViewがあったとする。
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgRSh0otltktaIZqVMMIBbdz_TpA2KHrKCpJV5MujSsENRq4SfOAUmzUmVsi2nfRqKzIL2REvYHKClrZAQPMHrtSxcsx02GyjXsvVva1sHpX8DyPZWGKj3TPzkctD2-hvqMjitoZQ/s320/android40_normal.png)
Clickできる箇所は、外側の白い部分(下図のA)と、上の水色の部分(下図のB)。残りはnon clickable。すべてのViewのbackgroundDrawableは、stateful(pressedステートだと色が暗くなる)とする。
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjsaQck7hrhZg0EWAhkwGPTuuJ883xyvXk8KLGj188754d_YIp6NiqKUWcJq3McsIHB0ecYNQJ_S5d33c06s-YFmMXFv7FoPYgtHelby0vx_ljXXYc4hqvE_0Rr0QGXTbdMcVzY3g/s320/AB.png)
Android 4.1以降では、子にもpressedステートが伝わる
Android4.1以降でAをクリックした場合は、Aの領域すべてが暗くなる(子にもpressedステートが伝わる)。ただしclickableなBには伝わらない。
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiN3_DhlOFku1PImoezaoacRvznxJtqNN2WmtSQ3k3dF_qgjgfF9XrWXPHzS-vBVOBFI9xH3ynTFMYGbqenCKXT9Q-9EeIbmzERG8ViGCa_lvagNQi8ycX-YuPoOx9qevdlYWo6_A/s320/android43_A.png)
Android4.1以降でBをクリックした場合は、Bの領域が暗くなる(Bの中にあるnon clickableな子にもpressedステートが伝わっている)。
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfsvKjjlVvIep5IgyYZ9BYKxIQrG_mPy-eGlbZ1bcIr-y-eqgGD0kw-U-CkylnRB0DyOHc3R0XfDuo4C4oLCL4nb6fdrfbUnf6jypNp-qn0Gon5bgsised9rPXEpp9-vDCM7F_DA/s320/android43_B.png)
Android 4.0以前では、子にpressedステートが伝わらない
一方、Android4.0でAをクリックした場合。子にpressedステートが伝わっていないので、子の色が変わらない。
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjXTCiph1IGxkAsWjLMTohvvlN1leJL3ta33oxfUe06QZuESxLQ3AlqX70ZrVcpFEduyA4w4xu1IgWa6xp483X13Bf3Gec2HsHQyLghR_JmKcNHEbcdMc-mg_5_qXtt7wAl_dYqog/s320/android40_A.png)
Android4.0でBをクリックした場合。同様にBの中にある子の色は変わっていない。
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiTMLz4FtwAsk6XK7Sc1sGt0oPK3LHfRe3irFDZKmU4hmkwCtU7p-zZTBkhppm9WRTP5tPftWHwvBtlx1z5Pa5sPpkWENONW36LFmMao6hOY72hKFQMfuavU0fY5eM3R3spvZfmBw/s320/android40_B.png)
なぜ動作が違うか
おそらく関係しているのはView.javaのこのcommit。
変更後は、ACTION_DOWNでsetPressed()が呼ばれるようになった。setPressed()が呼ばれるとdispatchSetPressed()が呼ばれ、そこから子のViewのsetPressed()が呼ばれる。
0 件のコメント:
コメントを投稿