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:
- Se
customView
ActionBar
botón personalizado "agregar elemento" en lacustomView
deActionBar
. - Se eliminaron
collapseActionView
yandroid:actionLayout
del elemento de búsqueda enmenu.xml
- 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>