android - ¿Cómo eliminar el foco de SearchView?
focus (9)
Quiero eliminar el foco y el texto de onResume()
en onResume()
.
Intenté searchView.clearFocus()
pero no está funcionando.
Este es mi código 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" />
Quiero eliminar el foco y el texto de
onResume()
enonResume()
Para lograr esto, puede establecer su diseño de raíz enfocable con el atributo android:focusableInTouchMode
y solicitar el enfoque en esa View
en onResume()
.
Por ejemplo:
<?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>
Y luego en tu 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();
}
Acabo de solicitar el enfoque a algún otro grupo de vista y eliminó el enfoque de la vista de búsqueda.
Escriba este código en onResume()
searchView.setText("");
this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
La solución más simple (y creo que la única que funciona al 100%) es crear un LinearLayout
invisible. Este LinearLayout
capturará el foco del EditText
.
Para aquellos que buscan deshacerse del enfoque cuando se inicia la Activity
Y el SearchView
está en el Menu
, hice estas 3 cosas, podría funcionar con solo algunas:
1.- Crear una clase padre de SearchView
. Llamémoslo RafaSearchView
:
class RafaSearchView @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0)
: SearchView(context, attrs, defStyleAttr) {
init {
setIconifiedByDefault(false)
}
}
2.- Obtenga el xml donde tiene su Toolbar
y configure touchable="false"
y 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.- En onCreateOptionsMenu(Menu)
cuando estoy declarando mi RafaSearchView
, llame:
searchView?.isIconified = false
searchView?.clearFocus()
Puede ocultar manualmente el teclado en la función onResume () como:
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);
}
Use esta línea de código en su método onResume
if (searchView != null) {
searchView.setQuery("", false);
searchView.clearFocus();
searchView.onActionViewCollapsed();
}
cuando framelayout
en la actividad, vaya al diseño principal, y en el fragment
también haga lo mismo en framelayout
. Solo agrega este atributo:
android:focusableInTouchMode="true"
solo uso 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>