¿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í?

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); 
  • ¿Podemos limitar el número de caracteres en edittext de SearchView en Android?
  • ¿Cómo desencadenar el redibujo de un padre Ver cuando se vuelve a dibujar alguno de sus hijos?
  • Cómo eliminar el espaciado del widget de pestañas en Android?
  • Posición personalizada de la pista en el cuadro de edición de texto.
  • ¿Cómo puedo hacer que mi diseño se mueva horizontal y verticalmente?
  • ImeOptions "actionNext" por programa - cómo saltar al siguiente campo?
  • Cómo guardar el lienzo de dibujo en android?
  • Android: EventHub.removeMessages (int what = 107) no es compatible antes de que se configure WebViewCore
  • Restablecimiento del valor del widget de búsqueda (SearchView)
  • Ocultar widget de la aplicación dependiendo del nivel de la API
  • ¿Cómo actualizar un widget de aplicación en la medianoche?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.