Android SearchView 焦點問題

版權聲明:本文爲博主原創文章,未經博主允許不得轉載。 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;
				}

			}
		});
	}

效果:





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章