コード コメント: 1. RelativeLayout の Clickable 属性が true に設定されており、これには Clickable 属性が false に設定されている子ビューがあります。2. duplicateParentState 属性がない、つまり duplicateParentState が false である。3. 子ビューは、textColor がカラー セレクターである TextView であるため、押された状態を確認できます。
動作: level16 より前では、RelativeLayout をクリックすると、押された状態が彼の chlid ビューに送信されません。ただし、レベル 16 以降では可能です。
理由: setPressed------>dispatchSetPressed------>押された状態を子ビューに送信----->childView.setPressed
レベル 15 の View.java onTouchEvent、
case MotionEvent.ACTION_DOWN:
mHasPerformedLongPress = false;
if (performButtonActionOnTouchDown(event)) {
break;
}
// Walk up the hierarchy to determine if we're inside a scrolling container.
boolean isInScrollingContainer = isInScrollingContainer();
// For views inside a scrolling container, delay the pressed feedback for
// a short period in case this is a scroll.
if (isInScrollingContainer) {
mPrivateFlags |= PREPRESSED;
if (mPendingCheckForTap == null) {
mPendingCheckForTap = new CheckForTap();
}
postDelayed(mPendingCheckForTap, ViewConfiguration.getTapTimeout());
} else {
// Not inside a scrolling container, so show the feedback right away
mPrivateFlags |= PRESSED; //comment by bran
refreshDrawableState();
checkForLongClick(0);
}
break;
レベル 16 の View.java onTouchEvent、
case MotionEvent.ACTION_DOWN:
mHasPerformedLongPress = false;
if (performButtonActionOnTouchDown(event)) {
break;
}
// Walk up the hierarchy to determine if we're inside a scrolling container.
boolean isInScrollingContainer = isInScrollingContainer();
// For views inside a scrolling container, delay the pressed feedback for
// a short period in case this is a scroll.
if (isInScrollingContainer) {
mPrivateFlags |= PREPRESSED;
if (mPendingCheckForTap == null) {
mPendingCheckForTap = new CheckForTap();
}
postDelayed(mPendingCheckForTap, ViewConfiguration.getTapTimeout());
} else {
// Not inside a scrolling container, so show the feedback right away
setPressed(true); //comment by bran
checkForLongClick(0);
}
break;
Bran によるコード行に注意してください。これらは異なります。setPressed(真); mPrivateFlags |= PRESSED だけではありません。および refreshDrawableState(); 、しかしdispatchSetPressed。
Google の Android SDK 開発者がいる場合は、mPrivateFlags |= PRESSED を setPressed(true); に変更した理由を教えてください。