Android: Untergeordnete Ansicht, die den Status "Gedrückt" in der übergeordneten Ansicht in Jelly Bean teilt

Codekommentar: 1. Ein RelativeLayout Clickable-Attribut ist auf true gesetzt, was eine untergeordnete Ansicht beinhaltet, deren Clickable-Attribut auf false gesetzt ist. 2. Kein duplicateParentState-Attribut, dh duplicateParentState ist falsch. 3. Die untergeordnete Ansicht ist TextView, deren textColor die Farbauswahl ist, sodass der Druckstatus überprüft werden kann.

Verhalten: Wenn Sie vor Level 16 auf RelativeLayout klicken, wird der gedrückte Zustand nicht an seine chlid-Ansicht übertragen. In Level 16 oder höher ist dies jedoch möglich.

Grund: setPressed ------> dispatchSetPressed ------> gedrückten Zustand an die Kinderansicht übertragen -----> childView.setPressed

View.java onTouchEvent in Level 15,

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;

View.java onTouchEvent in Level 16,

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;

Bitte beachten Sie die Codezeile von Bran, diese sind unterschiedlich. setPressed (true); ist nicht nur mPrivateFlags | = PRESSED; und refreshDrawableState (); , aber dispatchSetPressed.

Wenn Sie ein Android SDK-Entwickler in Google sind, möchten Sie mir mitteilen, warum Sie mPrivateFlags | = PRESSED in setPressed (true); ändern.

Antworten auf die Frage(0)

Ihre Antwort auf die Frage