/**
* Called internally by the view system when a new view is getting focus.
* This is what clears the old focus.
+ * <p>
+ * <b>NOTE:</b> The parent view's focused child must be updated manually
+ * after calling this method. Otherwise, the view hierarchy may be left in
+ * an inconstent state.
*/
void unFocus() {
if (DBG) {
}
private boolean enterTouchMode() {
- if (mView != null) {
- if (mView.hasFocus()) {
- // note: not relying on mFocusedView here because this could
- // be when the window is first being added, and mFocused isn't
- // set yet.
- final View focused = mView.findFocus();
- if (focused != null && !focused.isFocusableInTouchMode()) {
- final ViewGroup ancestorToTakeFocus =
- findAncestorToTakeFocusInTouchMode(focused);
- if (ancestorToTakeFocus != null) {
- // there is an ancestor that wants focus after its descendants that
- // is focusable in touch mode.. give it focus
- return ancestorToTakeFocus.requestFocus();
- } else {
- // nothing appropriate to have focus in touch mode, clear it out
- focused.unFocus();
- return true;
- }
+ if (mView != null && mView.hasFocus()) {
+ // note: not relying on mFocusedView here because this could
+ // be when the window is first being added, and mFocused isn't
+ // set yet.
+ final View focused = mView.findFocus();
+ if (focused != null && !focused.isFocusableInTouchMode()) {
+ final ViewGroup ancestorToTakeFocus = findAncestorToTakeFocusInTouchMode(focused);
+ if (ancestorToTakeFocus != null) {
+ // there is an ancestor that wants focus after its
+ // descendants that is focusable in touch mode.. give it
+ // focus
+ return ancestorToTakeFocus.requestFocus();
+ } else {
+ // nothing appropriate to have focus in touch mode, clear it
+ // out
+ focused.clearFocus();
+ return true;
}
}
}