如何检测SearchView的虚拟键盘何时被解除

时间:2018-02-13 13:46:50

标签: android android-virtual-keyboard

我想在虚拟键盘被解雇时调用mSearchView.clearFocus(),该怎么做?

我的问题是,一旦SearchView聚焦,它就会保持专注,所以如果我使用后退按钮取消虚拟键盘,并打开一个AlertDialog - 例如 - 一旦我关闭AlertDialog作为搜索,虚拟键盘会再次弹出视图仍然具有焦点,就好像它重新获得焦点一样。

对于我使用的SearchView:

    android:iconifiedByDefault="false"
    android:focusable="false"
该活动的

保存我使用的SearchView:

android:windowSoftInputMode="stateUnspecified|adjustPan"

即使我将其更改为以下内容我也会遇到同样的问题

android:windowSoftInputMode="stateAlwaysHidden|adjustPan"

Eidt 1:

更改

    android:iconifiedByDefault="false"

    android:iconifiedByDefault="true"

没有解决问题,我得到了相同的结果。

编辑2:

我尝试了创建自定义SearchView并覆盖onKeyPreIme并调用clearFocus()的方法,但是onKeyPreIme没有被调用。

public class ModifiedSearchView extends SearchView {
    public ModifiedSearchView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public boolean onKeyPreIme (int keyCode, KeyEvent event)
    {
        if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_UP) {
            clearFocus();
            return false;
        }

        return super.dispatchKeyEvent(event);

    }
}

3 个答案:

答案 0 :(得分:0)

要隐藏键盘,请使用此

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/root_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:focusableInTouchMode="true">

    <SearchView
        android:id="@+id/search_view"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:iconifiedByDefault="false"/>

</LinearLayout>

然后在你onBackPressed()

if (searchView != null) {
searchView.setQuery("", false);
searchView.clearFocus();
rootView.requestFocus();

}

rootView

rootView = findViewById(R.id.root_layout);

答案 1 :(得分:0)

我尝试将searchview添加到linerlayout,我没有像你一样的问题。但是,如果要跟踪虚拟键盘隐藏事件,请在onCreate()

中使用以下代码
mLLWrapper.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                Rect r = new Rect();
                mLLWrapper.getWindowVisibleDisplayFrame(r);

                int heightDiff = mLLWrapper.getRootView().getHeight() - (r.bottom - r.top);
                if (heightDiff > 300) { // if more than 100 pixels, its probably
                    // keyboard visible
                } else {
                    // keyboard in not visible
                }
            }
        });

mLLWrapper是活动的根LinearLayout视图

键盘解除后,请调出清晰焦点。这可能有所帮助。如果没有使用更多代码更新您的问题,我们将很容易为您提供帮助。

答案 2 :(得分:0)

尝试这种方式

internal class ProductSearchView(context: Context, attrs: AttributeSet) : SearchView(context, attrs) {

    override fun dispatchKeyEventPreIme(event: KeyEvent?): Boolean {
       return false
    }
}