diff options
| -rw-r--r-- | core/java/android/view/FocusFinder.java | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/core/java/android/view/FocusFinder.java b/core/java/android/view/FocusFinder.java index 48e5ca9a20f4..af26a88e877c 100644 --- a/core/java/android/view/FocusFinder.java +++ b/core/java/android/view/FocusFinder.java @@ -193,6 +193,8 @@ public class FocusFinder { private View findNextUserSpecifiedFocus(ViewGroup root, View focused, int direction) { // check for user specified next focus View userSetNextFocus = focused.findUserSetNextFocus(root, direction); + View cycleCheck = userSetNextFocus; + boolean cycleStep = true; // we want the first toggle to yield false while (userSetNextFocus != null) { if (userSetNextFocus.isFocusable() && userSetNextFocus.getVisibility() == View.VISIBLE @@ -201,6 +203,14 @@ public class FocusFinder { return userSetNextFocus; } userSetNextFocus = userSetNextFocus.findUserSetNextFocus(root, direction); + if (cycleStep = !cycleStep) { + cycleCheck = cycleCheck.findUserSetNextFocus(root, direction); + if (cycleCheck == userSetNextFocus) { + // found a cycle, user-specified focus forms a loop and none of the views + // are currently focusable. + break; + } + } } return null; } |