Как убрать фокус из SearchView?
Я хочу удалить фокус и текст из SearchView
в onResume()
,
Я старался searchView.clearFocus()
Но это не работает.
Это мой код XML:
<SearchView
android:id="@+id/searchView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignBottom="@+id/toolbar"
android:layout_alignTop="@+id/toolbar"
android:layout_centerVertical="true"
android:layout_marginBottom="4dp"
android:layout_marginTop="4dp"
android:iconifiedByDefault="false"
android:paddingLeft="16dp"
android:paddingRight="16dp" />
12 ответов
Я хочу удалить фокус и текст из
SearchView
вonResume()
Чтобы достичь этого, вы можете настроить корневую структуру с помощью android:focusableInTouchMode
атрибут и запрос сосредоточиться на этом View
в onResume()
,
Например:
<?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>
И тогда в вашем Activity
:
private View rootView;
private SearchView searchView;
// ...
@Override
protected void onCreate(Bundle savedInstanceState) {
// ...
rootView = findViewById(R.id.root_layout);
searchView = (SearchView) findViewById(R.id.search_view);
}
@Override
protected void onResume() {
super.onResume();
searchView.setQuery("", false);
rootView.requestFocus();
}
Когда в деятельности перейти к родительскому макету, а в fragment
тоже сделать то же самое в framelayout
, Просто добавьте этот атрибут:
android:focusableInTouchMode="true"
Используйте эту строку кода в вашем методе onResume
if (searchView != null) {
searchView.setQuery("", false);
searchView.clearFocus();
searchView.onActionViewCollapsed();
}
В вашем виджете SearchView просто добавьте
android:focusable="false"
Полный код виджета
<android.support.v7.widget.SearchView
android:id="@+id/your_search_view_id"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:iconifiedByDefault="false"
app:queryHint="Search something..."
android:focusable="false" />
Написать этот код в onResume()
searchView.setText("");
this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
Только что searchView.clearFocus();
в onResume()
помог мой случай
Я просто запросил фокус на какой-то другой группе просмотра, и он удалил фокус из поиска.
Вы можете вручную скрыть клавиатуру в функции onResume() как:
InputMethodManager imm = (InputMethodManager) context.getSystemService(context.INPUT_METHOD_SERVICE);
View view = context.getCurrentFocus();
if (view == null) {
view = new View(context);
}
if (view != null) {
IBinder iBinder = view.getWindowToken();
imm.hideSoftInputFromWindow(iBinder, 0);
}
Для тех, кто хочет избавиться от фокуса, когда Activity
запущен И SearchView
находится в Menu
Я сделал эти 3 вещи, это может работать только с несколькими:
1.- Создайте родительский класс SearchView
, Давайте назовем это RafaSearchView
:
class RafaSearchView @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0)
: SearchView(context, attrs, defStyleAttr) {
init {
setIconifiedByDefault(false)
}
}
2.- Получить XML, где у вас есть Toolbar
и установить touchable="false"
а также focusableInTouchMode="true"
:
<androidx.appcompat.widget.Toolbar
android:id="@+id/searchToolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="@color/white"
android:focusable="false"
android:focusableInTouchMode="true"
android:theme="@style/ToolBarStyle"
app:popupTheme="@style/AppTheme.PopupOverlay" />
3.- Вкл onCreateOptionsMenu(Menu)
когда я объявляю RafaSearchView
, вызов:
searchView?.isIconified = false
searchView?.clearFocus()
Самое простое (и я думаю, единственное на 100% работающее) решение - создать невидимое LinearLayout
, это LinearLayout
захватит фокус с EditText
,
Это будет работать на 100%, чтобы убрать фокус с SearchView.
override fun onResume() {
if (searchView != null) {
searchView.clearFocus();
}
super.onResume()
}
Я просто использую android:focusable="false"
<SearchView
android:layout_width="match_parent"
android:id="@+id/search"
android:paddingLeft="8dp"
android:paddingRight="8dp"
android:focusable="false"
android:iconifiedByDefault="false"
android:layout_height="wrap_content">
</SearchView>