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