Comment construire ActionBar
avec une vue de recherche réductible avec un seul élément d'action visible, lorsque la vue de recherche est développée? Pour être plus descriptif, voici ce dont j'ai besoin:
Notez qu’il existe d’autres éléments de menu et que Android:uiOptions="splitActionBarWhenNarrow"
est défini dans AndroidManifest.xml
.
J'ai essayé de configurer la disposition des éléments de recherche personnalisés:
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>
Mais par défaut, la vue de recherche prend toute la largeur disponible et le bouton n'est pas visible. Je ne sais pas comment forcer SearchView
à remplir tout l'espace disponible entre l'icône de l'application et l'élément de menu. Tout ce que j'ai trouvé est la propriété Android:maxWidth
, mais cela ne permet que de coder en dur, et je cherche une solution plus flexible. J'ai aussi essayé RelativeLayout
avec Android:layout_toRightOf="@id/search_view"
sans succès.
Après avoir pris en compte les suggestions des commentaires, de nombreuses recherches sur Google et tests ont permis d’obtenir l’effet souhaité. Je ne suis pas fier de cette solution mais cela fonctionne, ce n'est pas trop compliqué et cela devrait suffire dans ce cas.
En résumé ce que j'ai fait:
SearchView
avec le bouton "ajouter un élément" personnalisé dans customView
de ActionBar
collapseActionView
et Android:actionLayout
supprimés de l'élément de recherche dans menu.xml
SearchView
par programme.Du code pour mieux comprendre ce que j'ai fait. Peut-être que cela peut être utile pour quelqu'un.
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;
}
// ...
}
Vous pouvez le faire uniquement en utilisant yourmenu.xml.
Configurez votre autre icône de menu pour qu’elle apparaisse toujours comme une action . Votre menu.xml devrait ressembler à ceci:
<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"
/>
Simplement tu peux le faire comme ça
@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;
}
Et à l'élément de recherche dans menu.xml make
showAsAction = "toujours"
Remarque: j'utilise Android.support.v7.widget.SearchView, mais dans votre cas, cela n'a pas d'importance.
Juste un changement de menu xml. préfixe showaction au nom de votre application
<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>