Как определить, когда виртуальная клавиатура SearchView отклонена

Я хочу вызвать 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);

    }
}

2 ответа

Попробуй так

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

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

Я попытался добавить 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 активности

После того, как клавиатура распущена, вызовите четкую фокусировку. Это может помочь. Если нет, обновите ваш вопрос, добавив больше кода, и мы легко вам поможем.

Чтобы скрыть клавиатуру, используйте эту

<?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);
Другие вопросы по тегам