Android SearchView 焦点问题

本文探讨了在Android中SearchView在关闭软键盘后仍保持焦点的问题,问题源于焦点实际在其内部的SearchAutoComplete组件上。通过监听软键盘状态和获取当前焦点视图,可以精确控制SearchView及其子组件的焦点,从而解决问题。解决方案包括监听布局变化,判断焦点视图类型,并适时调用clearFocus方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


问题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;
				}

			}
		});
	}

效果:





评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值