ViewがDisable状態の場合のpressedフラグ
最近Androidアプリを作っていて予期せぬ動きをされたことがあったので紹介します。
その動きと言うのはViewがDisable状態の際にpressedフラグを立ててそのViewをタッチするとフラグが落ちるというものです。
何故そんな挙動をするかframeworkのソースを確認してみたところ下記★の怪しい処理を見つけました。
View
public boolean onTouchEvent(MotionEvent event) {
final int viewFlags = mViewFlags;
if ((viewFlags & ENABLED_MASK) == DISABLED) {
if (event.getAction() == MotionEvent.ACTION_UP && (mPrivateFlags & PFLAG_PRESSED) != 0) {
★ setPressed(false);
}
// A disabled view that is clickable still consumes the touch
// events, it just doesn't respond to them.
return (((viewFlags & CLICKABLE) == CLICKABLE ||
(viewFlags & LONG_CLICKABLE) == LONG_CLICKABLE));
}
★部分ではViewの状態がDisableでpressedフラグが立っているとタッチ時にフラグが落とされてしまいます。
今回はpressedフラグを落とされると困るためonTouchEvent()をオーバーライドしDisable時は処理が行われないよう対策しました。
そもそもDisableなのにpressedが立っていることがおかしいという突込みは置いておいてアプリが期待しない挙動をする際にAndroidのソースコードを眺めてみると解決の糸口が見つかる場合もあるので困ったときはAndroidのGitを見てみてください。