问题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() {@Overridepublic void onGlobalLayout() {// TODO Auto-generated method stub// 获取当前焦点所在ViewView 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;}}});}

效果:





更多相关文章

  1. Android按键监听和AsyncTask异步处理
  2. Android(安卓)应用布局文件的命名规则
  3. android定位服务
  4. Android(安卓)EditText获取焦点后只显示光标不弹出软键盘
  5. Android(安卓)录音实现方法、仿微信语音、麦克风录音、发送语音
  6. android ListView添加事件并获取选中项的值
  7. 01-android快速入门
  8. Xamarin.Android(安卓)自定义VideoView 进度条
  9. android 中findViewById()为null的可能原因

随机推荐

  1. Kotlin 第二弹:Android(安卓)中 PDF 创建
  2. Ruboto:Android(安卓)之上的 Ruby
  3. 推荐一款一键切换到无线调试的Android(安
  4. Android中使用WebView与JS交互全解析
  5. 展讯android LEDS模块分析----一个bug
  6. Android偏移动画-转圈的Button
  7. Android主线程looper是死循环问题
  8. Android小游戏:功夫蛇 团队开发经验总结
  9. Android(安卓): 多点触摸
  10. Android(安卓)API Guides---Styles and T