¿Cómo ocultar el botón de cierre en la vista de búsqueda de forma predeterminada?
He implementado una vista de búsqueda de android en la barra de acción. Cuando la vista de búsqueda gana el enfoque, aparece el botón de cierre [x] a la derecha. Eché un vistazo a otras aplicaciones nativas de Android, como Contactos y Gmail. El botón de cierre no se muestra cuando la vista de búsqueda gana el foco. ¿Cómo configurar mi vista de búsqueda se comporta así?
- Android: ¿Cómo hacer que los botones deslizantes como botón de desbloqueo del teléfono en el protector de pantalla?
- Android: Actualizar el widget en la disponibilidad de la conexión de red
- Cómo configurar mi teclado personal como entrada estándar en mi aplicación
- Depuración del código de widgets de Android en Eclipse
- No se puede escribir dentro de un WebView
- ¿Qué componente de visualización utiliza Google Plus App (Stream)?
- Mostrar cuadro de diálogo casi pantalla completa en mi caso (con ActionBar y superposición)
- RadioGroup, setEnabled (false) no funciona!
- Diseño relativo ignorando setMargin ()
- Widget personalizado utilizando LinearLayout no obtener onDraw ()
- Android Widget cambia programaticamente la configuración de remoteView
- Permitir al usuario insertar una imagen en la aplicación android
- Cómo cambiar el texto en datepicker?
Me enfrenté al mismo problema con android.support.v7.widget.SearchView
y encontré una solución. Primero, en onCreateOptionsMenu
, puede obtener una referencia al SearchView así como a su botón de cierre:
@Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { super.onCreateOptionsMenu(menu, inflater); inflater.inflate(R.menu.search, menu); MenuItem searchItem = menu.findItem(R.id.action_search); mSearchView = (SearchView) MenuItemCompat.getActionView(searchItem); try { Field searchField = SearchView.class.getDeclaredField("mCloseButton"); searchField.setAccessible(true); mSearchCloseButton = (ImageView) searchField.get(mSearchView); } catch (Exception e) { Log.e(TAG, "Error finding close button", e); } }
Ahora puede intentar modificar el botón. Primero traté de usar setVisibility(View.GONE)
para ocultar el botón de cierre, pero eso no funciona, porque el SearchView restablece la visibilidad de su botón de cierre cuando el usuario interactúa con SearchView. Así que mi solución fue usar un transparente dibujable y desactivar el clic del botón de cierre:
if (mSearchCloseButton != null) { mSearchCloseButton.setEnabled(false); mSearchCloseButton.setImageDrawable(getResources().getDrawable(R.drawable.transparent)); }
Este artículo me ayudó también:
http://novoda.com/blog/styling-actionbar-searchview
Sin embargo, esto es bastante hacky para ser honesto. Sería más limpio agarrar la fuente de SearchView de https://android.googlesource.com/platform/frameworks/support.git/+/master/v7/appcompat/src/android/support/v7/widget/SearchView.java y Crear su propia versión de SearchView que hace el ocultar / mostrar el botón de cierre.
Actualizar:
Google acaba de anunciar AppCompat v21, que tiene mejoras de estilo para el widget SearchView:
http://android-developers.blogspot.com/2014/10/appcompat-v21-material-design-for-pre.html
Establecer searchView.setIconifiedByDefault(false)
desactivará el colapso de la vista de búsqueda y también eliminará el botón de cierre.
Puede obtener un enlace al botón desde un objeto SearchView (AppCompat v23.2.1):
searchView = (SearchView) MenuItemCompat.getActionView(menu.findItem(R.id.action_search)); ImageView mCloseButton = (ImageView) searchView.findViewById(android.support.v7.appcompat.R.id.search_close_btn);
A continuación, puede asignar un oyente a los cambios de texto SearchView (SearchView también cambia la visibilidad del botón, pero el oyente se ejecutará después y anulará los cambios):
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { @Override public boolean onQueryTextSubmit(String query) { return false; } @Override public boolean onQueryTextChange(String newText) { mCloseButton.setVisibility(newText.isEmpty() ? View.GONE : View.VISIBLE); return false; } });
Y finalmente, un oyente para ocultar el icono cuando SearchView se expande desde el estado iconificado:
searchView.setOnSearchClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // hide "x" button if there is no text String query = searchView.getQuery().toString(); mCloseButton.setVisibility(query.isEmpty() ? View.GONE : View.VISIBLE); } });
También puede usar esto para ocultar el cierre del botón
ImageView closeBtn = (ImageView) searchView.findViewById(R.id.search_close_btn); closeBtn.setEnabled(false); closeBtn.setImageDrawable(null);
- ¿Cuándo debo usar cada uno de los diferentes tipos de mensajería de Android?
- Instalar Android Support Repository sin conexión