0

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

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

对于我使用的 SearchView:

    android:iconifiedByDefault="false"
    android:focusable="false"

对于活动包含我使用的 SearchView:

android:windowSoftInputMode="stateUnspecified|adjustPan"

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

android:windowSoftInputMode="stateAlwaysHidden|adjustPan"

开斋节 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);

    }
}
4

3 回答 3

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);
于 2018-02-13T13:55:22.570 回答
0

我尝试将搜索视图添加到 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 视图

关闭键盘后,呼叫清除焦点。这可能会有所帮助。如果不使用更多代码更新您的问题,我们将很容易为您提供帮助。

于 2018-02-14T09:47:27.117 回答
0

试试这个方法

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

    override fun dispatchKeyEventPreIme(event: KeyEvent?): Boolean {
       return false
    }
}
于 2019-02-23T03:16:39.847 回答