example ejemplo docs bar android android-actionbar searchview

ejemplo - Android ActionBar: SearchView plegable con botón de acción



searchview android example listview (4)

¿Cómo construir ActionBar con vista de búsqueda plegable con un elemento de acción simple visible cuando se expande la vista de búsqueda? Para ser más descriptivo, esto es lo que necesito:

Tenga en cuenta que hay otros elementos de menú y android:uiOptions="splitActionBarWhenNarrow" se define en AndroidManifest.xml .

Intenté configurar el diseño de elementos de búsqueda personalizados:

menu.xml

<item android:id="@+id/menu_search" android:actionLayout="@layout/actionbar_search" android:icon="@drawable/action_search" android:showAsAction="always|collapseActionView" android:title="@string/search" />

actionbar_search.xml

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="right" android:orientation="horizontal" > <com.actionbarsherlock.widget.SearchView android:id="@+id/search_view" android:layout_width="wrap_content" android:layout_height="match_parent" android:iconifiedByDefault="false" android:queryHint="@string/search_hint" /> <ImageButton android:id="@+id/add_item" android:layout_width="wrap_content" android:layout_height="match_parent" style="@style/Widget.Sherlock.ActionButton" android:src="@drawable/content_new"/> </LinearLayout>

Pero por defecto, la vista de búsqueda toma todo el ancho disponible y el botón no está visible. No sé cómo forzar SearchView para llenar todo el espacio disponible entre el icono de la aplicación y el elemento del menú. Todo lo que encontré es la propiedad android:maxWidth , pero esto solo permite una dimensión codificada, y estoy buscando una solución más flexible. Intenté también RelativeLayout con android:layout_toRightOf="@id/search_view" sin suerte.


Puedes hacerlo solo usando tumenu.xml.

Configure su otro ícono de menú para que se muestre siempre como una acción. Tu menu.xml debería verse así:

<item android:id="@+id/menu_search" android:actionLayout="@layout/actionbar_search" android:icon="@drawable/action_search" android:showAsAction="always|collapseActionView" android:title="@string/search" /> <item android:id="@+id/your_other_menu_id" android:showAsAction="always" android:icon="@android:drawable/your_other_menu_ic" />


Simplemente puedes hacerlo así

@Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); MenuItem searchItem = menu.findItem(R.id.action_search); searchView = (SearchView) MenuItemCompat.getActionView(searchItem); searchView.setIconified(true); //to be opened collapsed return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch(item.getItemId()){ case R.id.action_search: searchView.setIconified(false);// to Expand the SearchView when clicked return true; } return false; }

Y en el elemento de búsqueda en menu.xml make

showAsAction = "siempre"

Nota: Estoy usando android.support.v7.widget.SearchView, pero en su caso no importa


Después de considerar las sugerencias de los comentarios, muchas búsquedas en Google y pruebas lograron obtener el efecto deseado. No estoy orgulloso de esta solución pero funciona, no es demasiado complicada y debería ser suficiente para este caso.

En resumen, lo que hice:

  1. Se customView ActionBar botón personalizado "agregar elemento" en la customView de ActionBar .
  2. Se eliminaron collapseActionView y android:actionLayout del elemento de búsqueda en menu.xml
  3. Colapsar / expandir SearchView programación.

Un poco de código para entender mejor lo que hice. Tal vez esto puede ser útil para alguien.

menu.xml

<item android:id="@+id/menu_search" android:icon="@drawable/action_search" android:showAsAction="always" android:title="@string/search" /> // ... other menu items

actionbar_search.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="right" android:orientation="horizontal"> <com.actionbarsherlock.widget.SearchView android:id="@+id/search_view" android:layout_width="wrap_content" android:layout_height="match_parent" android:iconifiedByDefault="false" android:queryHint="@string/search_hint" android:visibility="invisible" /> <ImageButton android:id="@+id/add_item" android:layout_width="wrap_content" android:layout_height="match_parent" style="@style/Widget.Sherlock.ActionButton" android:src="@drawable/content_new" android:title="@string/add_item" /> </LinearLayout>

MainActivity.java

@Override public void onCreate(Bundle savedInstanceState) { // ... actionBar.setCustomView(R.layout.actionbar_search); actionBarCustomView = ab.getCustomView(); searchView = ((SearchView) actionBarCustomView.findViewById(R.id.search_view)); searchView.setOnCloseListener(new SearchView.OnCloseListener() { @Override public boolean onClose() { searchView.setVisibility(View.INVISIBLE); return false; } }); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { // ... case R.id.menu_search: if (searchView.getVisibility() == View.VISIBLE) { searchView.setIconified(true); searchView.setVisibility(View.INVISIBLE); } else { searchView.setMaxWidth(abCustomView.getWidth() - addButton.getWidth()); searchView.setVisibility(View.VISIBLE); searchView.setIconified(false); } break; // ... } return true; } @Override public void onBackPressed() { if (searchView.getVisibility() == View.VISIBLE) { searchView.setIconified(true); searchView.setVisibility(View.INVISIBLE); return; } // ... }


Solo un menú de cambio xml. prefijo showaction al nombre de su aplicación

<menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" > <item android:id="@+id/menu_search" android:actionLayout="@layout/actionbar_search" android:icon="@drawable/action_search" app:showAsAction="always|collapseActionView" android:title="@string/search" /> </menu>