5

コード コメント: 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); に変更した理由を教えてください。

4

0 に答える 0