google-code-prettify

2015-06-23

Android4.0以前と4.1以降では、親のViewをクリックした時に子のViewがどう見えるのかが異なる

Android4.0以前と4.1以降では、親のViewをクリックした時に子のViewがどう見えるのかが異なるので注意が必要。

以下のようなViewがあったとする。



Clickできる箇所は、外側の白い部分(下図のA)と、上の水色の部分(下図のB)。残りはnon clickable。すべてのViewのbackgroundDrawableは、stateful(pressedステートだと色が暗くなる)とする。



Android 4.1以降では、子にもpressedステートが伝わる


Android4.1以降でAをクリックした場合は、Aの領域すべてが暗くなる(子にもpressedステートが伝わる)。ただしclickableなBには伝わらない。



Android4.1以降でBをクリックした場合は、Bの領域が暗くなる(Bの中にあるnon clickableな子にもpressedステートが伝わっている)。



Android 4.0以前では、子にpressedステートが伝わらない


一方、Android4.0でAをクリックした場合。子にpressedステートが伝わっていないので、子の色が変わらない。



Android4.0でBをクリックした場合。同様にBの中にある子の色は変わっていない。



なぜ動作が違うか


おそらく関係しているのはView.javaのこのcommit

変更後は、ACTION_DOWNでsetPressed()が呼ばれるようになった。setPressed()が呼ばれるとdispatchSetPressed()が呼ばれ、そこから子のViewのsetPressed()が呼ばれる。




0 件のコメント: