diff options
| author | 2017-08-10 20:32:03 +0000 | |
|---|---|---|
| committer | 2017-08-10 20:32:03 +0000 | |
| commit | c10cc1185b0024a12660f4de7fbb6ad78bd1cfb7 (patch) | |
| tree | 16a08a317381ff14345413439aa183666782e01c | |
| parent | d767cec54192514ae2089939025e764a23800117 (diff) | |
| parent | e329c38c4af8041ed243075c2e7c5a341d2e1042 (diff) | |
Merge "Disabled views won't receive focus"
| -rw-r--r-- | core/java/android/view/View.java | 28 |
1 files changed, 23 insertions, 5 deletions
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index eea692aa952a..8d55b473acf7 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -6856,8 +6856,9 @@ public class View implements Drawable.Callback, KeyEvent.Callback, } } - // Invisible and gone views are never focusable. - if ((mViewFlags & VISIBILITY_MASK) != VISIBLE) { + // Invisible, gone, or disabled views are never focusable. + if ((mViewFlags & VISIBILITY_MASK) != VISIBLE + || (mViewFlags & ENABLED_MASK) != ENABLED) { return false; } @@ -10483,7 +10484,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, if (views == null) { return; } - if (!isFocusable()) { + if (!isFocusable() || !isEnabled()) { return; } if ((focusableMode & FOCUSABLES_TOUCH_MODE) == FOCUSABLES_TOUCH_MODE @@ -10806,7 +10807,8 @@ public class View implements Drawable.Callback, KeyEvent.Callback, private boolean requestFocusNoSearch(int direction, Rect previouslyFocusedRect) { // need to be focusable if ((mViewFlags & FOCUSABLE) != FOCUSABLE - || (mViewFlags & VISIBILITY_MASK) != VISIBLE) { + || (mViewFlags & VISIBILITY_MASK) != VISIBLE + || (mViewFlags & ENABLED_MASK) != ENABLED) { return false; } @@ -13284,12 +13286,28 @@ public class View implements Drawable.Callback, KeyEvent.Callback, // about in case nothing has focus. even if this specific view // isn't focusable, it may contain something that is, so let // the root view try to give this focus if nothing else does. - if ((mParent != null)) { + if ((mParent != null) && (mViewFlags & ENABLED_MASK) == ENABLED) { mParent.focusableViewAvailable(this); } } } + if ((changed & ENABLED_MASK) != 0) { + if ((mViewFlags & ENABLED_MASK) == ENABLED) { + // a view becoming enabled should notify the parent as long as the view is also + // visible and the parent wasn't already notified by becoming visible during this + // setFlags invocation. + if ((mViewFlags & VISIBILITY_MASK) == VISIBLE + && ((changed & VISIBILITY_MASK) == 0)) { + if ((mParent != null) && (mViewFlags & ENABLED_MASK) == ENABLED) { + mParent.focusableViewAvailable(this); + } + } + } else { + if (hasFocus()) clearFocus(); + } + } + /* Check if the GONE bit has changed */ if ((changed & GONE) != 0) { needGlobalAttributesUpdate(false); |