两个方法都是获取焦点:
requestFocus() 源码如下:
/**
* Call this to try to give focus to a specific view or to one of its descendants
* and give it hints about the direction and a specific rectangle that the focus
* is coming from. The rectangle can help give larger views a finer grained hint
* about where focus is coming from, and therefore, where to show selection, or
* forward focus change internally.
*
* @return Whether this view or one of its descendants actually took focus.
*/
public boolean requestFocus(int direction, Rect previouslyFocusedRect) {
// need to be focusable
if ((mViewFlags & FOCUSABLE_MASK) != FOCUSABLE ||
(mViewFlags & VISIBILITY_MASK) != VISIBLE) {
return false;
}
// need to be focusable in touch mode if in touch mode
if (isInTouchMode() &&
(FOCUSABLE_IN_TOUCH_MODE != (mViewFlags & FOCUSABLE_IN_TOUCH_MODE))) {
return false;
}
// need to not have any parents blocking us
if (hasAncestorThatBlocksDescendantFocus()) {
return false;
}
handleFocusGainInternal(direction, previouslyFocusedRect);
return true;
}
requestFocusFromTouch() 源码如下:
/**
* Call this to try to give focus to a specific view or to one of its descendants. This is a
* special variant of {@link #requestFocus() } that will allow views that are not focuable in
* touch mode to request focus when they are touched.
*
* @return Whether this view or one of its descendants actually took focus.
*
* @see #isInTouchMode()
*
*/
public final boolean requestFocusFromTouch() {
// Leave touch mode if we need to
if (isInTouchMode()) {
ViewRootImpl viewRoot = getViewRootImpl();
if (viewRoot != null) {
viewRoot.ensureTouchMode(false);
}
}
return requestFocus(View.FOCUS_DOWN);
}
从代码中可以看出:
requestFocus() 方法在三种情况下获取焦点不能生效。
1)对应的View不支持Focus;
2) 对应的View支持Focus,但是不支持在Touch模式下的Focus;
3) 对应的View其祖先View 设置了FOCUS_BLOCK_DESCENDANTS 标志, 阻止其子View获取焦点。
而requestFocusFromTouch() 方法设计的目的就是解决requestFocus() 在第二种不能获得焦点的情况下,Touch模式下不支持焦点,也能够获得焦点使用的。
本文探讨了Android中requestFocus()和requestFocusFromTouch()的区别。requestFocus()用于常规获取焦点,而requestFocusFromTouch()则在触摸事件发生时请求焦点。了解这两个方法的工作原理对于优化用户交互至关重要。
1564

被折叠的 条评论
为什么被折叠?



