Как определить, когда виртуальная клавиатура 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"

to be

    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);

    }
}

person Jack    schedule 13.02.2018    source источник
comment
вы используете его с menu.xml?   -  person Abdul Kawee    schedule 13.02.2018
comment
Нет, у меня есть SearchView внутри LinearLayout, который содержит другие представления.   -  person Jack    schedule 13.02.2018
comment
Моя активность получена из AppCompatActivity   -  person Jack    schedule 13.02.2018
comment
какие-нибудь обновления для этого разъема?   -  person Sam    schedule 23.02.2019


Ответы (3)


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

<?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);
person Abdul Kawee    schedule 13.02.2018
comment
Спасибо, он дает тот же результат и в худшем случае, когда я хочу, чтобы SearchView был сфокусирован при запуске действия (но без отображения клавиатуры), что соответствует android:iconifiedByDefault=false. - person Jack; 13.02.2018
comment
мы обычно устанавливаем searchView на панель инструментов как menue_options и имеем больше контроля над ее отображением и сокрытием. - person Abdul Kawee; 13.02.2018
comment
Спасибо, но я не хочу скрывать клавиатуру вручную, я просто хочу заставить ее потерять фокус, чтобы избежать повторного открытия клавиатуры, когда пользователь закрывает ее с помощью клавиши «Назад». - person Jack; 13.02.2018
comment
я бы посоветовал вам использовать его как options_menu на панели инструментов, у вас будет точный вывод, я использую его таким же образом. - person Abdul Kawee; 13.02.2018
comment
Спасибо, но в соответствии с дизайном его невозможно разместить на панели инструментов, так как панели инструментов нет, это полноэкранное действие. - person Jack; 13.02.2018
comment
Спасибо, но onBackPressed() не вызывается в первый раз — когда клавиатура исчезает, она вызывается, когда я снова нажимаю кнопку «Назад» после того, как она скрыта - person Jack; 13.02.2018

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

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

person ddassa    schedule 14.02.2018

попробуй так

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

    override fun dispatchKeyEventPreIme(event: KeyEvent?): Boolean {
       return false
    }
}
person Sam    schedule 23.02.2019