android - studio - ¿Cómo descartar/cerrar/contraer SearchView en ActionBar en MainActivity?
search view en android studio (6)
En menu_main.xml agrega:
<item android:id="@+id/action_search"
android:icon="@android:drawable/ic_menu_search"
android:title="Search"
app:showAsAction="collapseActionView|ifRoom"
android:orderInCategory="1"
app:actionViewClass="android.support.v7.widget.SearchView"
android:menuCategory="secondary"
/>
y en onCreateOptionsMenu
final MenuItem miSearch = menu.findItem(R.id.action_search);
SearchView searchView = (SearchView) miSearch.getActionView();
searchView.setQueryHint("Searh For");
searchView.setOnQueryTextListener(newSearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
Toast.makeText(context,query, Toast.LENGTH_LONG).show();
// Here Put Your Code.
//searchView.onActionViewCollapsed();
miSearch.collapseActionView();
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
return false;
}
});
Estoy intentando borrar y cerrar SearchView después de ingresar un valor. Encontré una solución pero cierra la búsqueda y no realizaré ninguna acción si trato de buscar nuevamente.
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main_actions, menu);
searchView = (SearchView) menu.findItem(R.id.action_search).getActionView();
searchView.setOnQueryTextListener(searchListener);
return super.onCreateOptionsMenu(menu);
}
SearchView.OnQueryTextListener searchListener = new SearchView.OnQueryTextListener(){
@Override
public boolean onQueryTextChange(String arg0) {
return false;
}
@Override
public boolean onQueryTextSubmit(String query) {
new JsoupGetData("http://api.openweathermap.org/data/2.5/find?q="+ query + "&lang=pl").execute();
try {
searchView.onActionViewCollapsed();
}
catch(Exception ex){
ex.printStackTrace();
System.out.println(ex);
}
return true;
}
};
Solo puedo buscar por primera vez. Cada vez que viene solo cierra mi teclado de entrada y no hace nada. ¿Cómo se puede realizar de manera correcta?
Editar. El cambio sugerido se ve así:
try {
searchView.setIconified(true);
}
activity_main_actions.xml:
<!-- Search Widget -->
<item android:id="@+id/action_search"
android:icon="@drawable/ic_action_search"
android:title="@string/action_search"
android:showAsAction="always"
android:actionViewClass="android.widget.SearchView"/>
Edit2:
Cambié showAsAction="always|collapseActionView"
pero cierra mi aplicación cuando hago clic en la búsqueda.
También puse al oyente dentro de OnCreateOptionsMenu para ver si cambia algo:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main_actions, menu);
searchMenuItem = menu.findItem(R.id.action_search);
searchView = (SearchView) searchMenuItem.getActionView();
searchView.setOnQueryTextListener(new OnQueryTextListener(){
@Override
public boolean onQueryTextChange(String arg0) {
return false;
}
@Override
public boolean onQueryTextSubmit(String query) {
if (searchMenuItem != null) {
boolean closed = searchMenuItem.collapseActionView();
Toast.makeText(getApplicationContext(), "closing: " + closed, Toast.LENGTH_SHORT).show();
}
new JsoupGetData("http://api.openweathermap.org/data/2.5/find?q="+ query + "&lang=pl").execute();
return false;
}
});
return super.onCreateOptionsMenu(menu);
}
Y el booleano closed
es false
, no sé por qué. Leí el documento pero no me dice nada.
Edit3:
He leído demasiado Internet sobre este tema y aún no está claro. El widget de búsqueda se borra, el teclado se oculta y se realiza la acción. El único problema es que la búsqueda no se ha colapsado, por lo que cubre el resto de botones de acción en la barra de acción.
@Override
public boolean onQueryTextSubmit(String query) {
searchView.setIconified(true);
searchView.clearFocus();
new JsoupGetData("http://api.openweathermap.org/data/2.5/find?q="+ query + "&lang=pl").execute();
return false;
}
Here leí que collapseActionView () no funcionará, porque mi búsqueda no es una vista sino un widget.
En mi caso llamando a invalidateOptionsMenu();
cierra SearchView
Hola, me enfrenté a un escenario similar y, por lo tanto, creo que esto cambió a un código que debería funcionar.
Espero que esto ayude...:)
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main_actions, menu);
Menu mMenuItem = menu.findItem(R.id.action_search_loc); // take a reference with menue item
searchView = (SearchView) mMenuItem.getActionView(); //use that to find searchview
searchView.setOnQueryTextListener(searchListener);
return super.onCreateOptionsMenu(menu);
}
SearchView.OnQueryTextListener searchListener = new SearchView.OnQueryTextListener(){
@Override
public boolean onQueryTextChange(String arg0) {
return false;
}
@Override
public boolean onQueryTextSubmit(String query) {
new JsoupGetData("http://api.openweathermap.org/data/2.5/find?q="+ query + "&lang=pl").execute();
try {
mMenuItem.collapseActionView(); //this will collapse your search view
}
catch(Exception ex){
ex.printStackTrace();
System.out.println(ex);
}
return true;
}
};
La solución mencionada here es simple y funciona perfectamente.
Básicamente, Call setQuery("", false)
y setIconified(true)
en SearchView
.
Parece que lo que está buscando es una forma de cerrar la barra de búsqueda mediante programación. Desafortunadamente, no hay un método o una solución equivalente para esto. Es posible que ya hayas visto otra publicación que tenía algunas sugerencias, pero no hay una forma real de hacerlo.
Su primera edición anterior que llama a setIconified(true)
es la mejor alternativa. Los documentos sugieren que llamar a setIconified(true)
debería contraer el widget de búsqueda, borrarlo y eliminarlo del foco si el atributo iconifiedByDefault
es verdadero (que es de manera predeterminada, por lo que no veo ningún problema con su activity_main_actions.xml).
Utilizar:
searchMenuItem.collapseActionView();
En lugar de:
searchView.onActionViewCollapsed();
Si está utilizando la AppCompat library
, entonces use:
MenuItemCompat.collapseActionView(searchMenuItem);