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.