版權聲明:本文爲博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/ContainsK/article/details/59489535
問題:SearchView 在退出軟鍵盤後,Focus依然存在的問題。並且還會搶其它控件Focus?在試過clearFocus後也依然不好使...
分析:原來當前焦點並不在SearchView 上,而是在它內部的 SearchAutoComplete mQueryTextView 上,所以SreachView clearFoucus沒有效果。
這是SearchView 設置焦點的代碼,其中調用了 mQueryTextView.requestFocus(direction, previouslyFocusedRect);
/** @hide */
@Override
public boolean requestFocus(int direction, Rect previouslyFocusedRect) {
// Don't accept focus if in the middle of clearing focus
if (mClearingFocus) return false;
// Check if SearchView is focusable.
if (!isFocusable()) return false;
// If it is not iconified, then give the focus to the text field
if (!isIconified()) {
boolean result = mQueryTextView.requestFocus(direction, previouslyFocusedRect);
if (result) {
updateViewsVisibility(false);
}
return result;
} else {
return super.requestFocus(direction, previouslyFocusedRect);
}
}
解決:
我要拿到mQueryTextView並且調用clearFocus(); 然後在調用SearchView.clearFocus();
首先監聽軟鍵盤彈起狀態:view.getViewTreeObserver().addOnGlobalLayoutListener(); //通過給根佈局View註冊佈局監聽器
獲取當前焦點所在View,判斷是否是SearchView$SearchAutoComplete ,然後根據軟鍵盤狀態與當前焦點View,控制SearchView的焦點位置
Code:
void regeKeyListener(final View v) {
// 註冊根View佈局監聽,監聽佈局大小改變
v.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
// TODO Auto-generated method stub
// 獲取當前焦點所在View
View currentFocus = getActivity().getCurrentFocus();
String name = currentFocus.getClass().getName();
Rect outRect = new Rect();
v.getWindowVisibleDisplayFrame(outRect);
// 計算比例,從而判斷軟鍵盤是否彈起
double dl = 1.0 * outRect.bottom / v.getMeasuredHeight();
if (dl < 0.8 && name.equals("android.widget.SearchView$SearchAutoComplete")) {
if (!isKeyUp) {
isKeyUp = true;
}
} else if (isKeyUp) {
currentFocus.clearFocus();
mSearchView.clearFocus();
isKeyUp = false;
}
}
});
}
效果: