web-dev-qa-db-fra.com

SearchView dans OptionsMenu pas toute la largeur

J'ai un SearchView de travail qui se développe dans mon OptionsMenu lorsque l'utilisateur appuie sur l'icône de recherche. Cependant, il ne se développe que dans l'espace disponible parmi les autres icônes du Menu Options. Sur un écran large, c'est très bien, mais avec un espace étroit, il ne reste plus que de la place pour afficher 5 à 10 caractères dans le champ de recherche. Je veux qu'il superpose les autres icônes, comme c'est le cas pour l'application Android Contacts. Actuellement, je construis avec targetSdkVersion = 17. J'espère que quelque chose de simple me manque :)

(Note ajoutée plus tard: la seule solution que j’ai trouvée fonctionnelle jusqu’à présent est de masquer toutes les icônes de menu lorsque je souhaite développer l’icône de recherche. C’est conceptuellement simple. passer par un tas de logique pour déterminer lesquels restaurer, ou conserver les variables d'état, etc.)

Voici mon article XML dans le menu Options:

<item
  Android:id="@+id/menu_search_shallow"
  Android:title="Search Current Folder"
  Android:icon="@drawable/ic_btn_search"
  Android:showAsAction="always|collapseActionView"
  Android:actionViewClass="Android.widget.SearchView" />

J'ai aussi dans mon code d'activité principale:

@Override
public boolean onCreateOptionsMenu (Menu menu)
{
  getMenuInflater().inflate(R.menu.nav_menu, menu);
  this.optionsMenu = menu;

  MenuItem searchItem = menu.findItem (R.id.menu_search_shallow);
  searchItem.setOnActionExpandListener (this);
  SearchView searchView = (SearchView) searchItem.getActionView();
  searchView.setQueryHint (getString (R.string.search_shallow_hint));

  searchItem = menu.findItem (R.id.menu_search_deep);
  searchItem.setOnActionExpandListener (this);
  searchView = (SearchView) searchItem.getActionView();
  searchView.setQueryHint (getString (R.string.search_deep_hint));
}

et

@Override
public boolean onMenuItemActionExpand(MenuItem item) 
{
  SearchView searchView = (SearchView) item.getActionView();
  searchView.setOnQueryTextListener (this);
  return true;
}

@Override
public boolean onMenuItemActionCollapse(MenuItem item) 
{
  SearchView searchView = (SearchView) item.getActionView();
  searchView.setQuery ("", false);
  return true;
}
31
Peri Hartman

J'ai eu un problème similaire, que la barre de recherche ne remplissait pas toute la largeur (mais je n'avais pas d'autres icônes) . Je l'ai résolu en ajoutant dans item: 

Android:actionLayout="@layout/my_search_view"

et dans layout/my_search_view.xml:

<?xml version="1.0" encoding="utf-8"?>
<SearchView xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content" />
3
jjung

Au lieu de créer une nouvelle mise en page, j'ai défini le MaxWidth par programme dans onCreateOptionsMenu ():

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.menu_search, menu);
    SearchView searchView = (SearchView)menu.findItem(R.id.menu_search).getActionView();
    searchView.setMaxWidth(Integer.MAX_VALUE);
    ....
106
clu

Pour une raison quelconque, la solution de jjung n'a pas fonctionné pour moi. Je devais ajouter Android:maxWidth="10000dp", juste une maxWidth vraiment élevée, pour le faire s'étendre à toute la largeur disponible.

En outre, juste pour ajouter, j'utilise la bibliothèque de support (v7), et mon fichier de présentation ressemble à ceci:

<Android.support.v7.widget.SearchView xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
    Android:maxWidth="10000dp" />

Et dans mon article, j'ai:

<menu xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:myapp="http://schemas.Android.com/apk/res-auto">
    <item
        ...
        myapp:actionLayout="@layout/searchview" />
...

myapp est juste un espace de noms arbitraire pour les attributs ajoutés par la bibliothèque de support (voir Ajout d'actions pour plus de détails).

15
mchristie

Peut-être que je suis en retard, mais je pense que cela pourrait être utile pour quelqu'un qui fait face au même problème que moi.

final SearchView searchView = (SearchView) myActionMenuItem.getActionView();
searchView.setMaxWidth(Integer.MAX_VALUE);//set search menu as full width

dans onCreateOptionsMenu de votre classe peut résoudre ce problème, mais nous devons comprendre une chose. Si vous voulez seulement afficher le menu de recherche (en cliquant sur le bouton de recherche) et pas d'autres éléments de menu dans la barre d'actions, vous devez conserver l'élément de recherche comme premier élément du fichier de menu. Voici un exemple

        <?xml version="1.0" encoding="utf-8"?>
    <menu xmlns:Android="http://schemas.Android.com/apk/res/Android"
        xmlns:app="http://schemas.Android.com/apk/res-auto">

<!--keeping searach as first item-->
        <item
            Android:id="@+id/action_search"
            Android:icon="@drawable/search_ab"
            Android:title="@string/search"
            app:actionViewClass="Android.support.v7.widget.SearchView"
            app:showAsAction="ifRoom" />

        <item
            Android:id="@+id/itemFilter"
            Android:icon="@drawable/filter"
            Android:title="@string/filter"
            app:showAsAction="ifRoom" />
    </menu>

Et il sera affiché sous la forme  enter image description here

en cliquant sur recherche, il sera affiché en pleine largeur

 enter image description here

Et si vous continuez à chercher en tant que deuxième ou dernier élément du menu, ce sera comme cela.

 enter image description here

et en cliquant sur recherche  enter image description here

4
KishanSolanki124

Il y a tellement de façons de résoudre ce problème - je vais simplement ajouter celui que j'ai utilisé dans plusieurs applications.

J'ai ma coutume SearchView (avec une autre personnalisation) qui s'étend Android.support.v7.widget.SearchView et afin de s'étirer à la largeur totale:

@Override
public void setLayoutParams(final ViewGroup.LayoutParams params) {
    params.width = ViewGroup.LayoutParams.MATCH_PARENT;
    super.setLayoutParams(params);
}
1
Oleksandr

Aussi fou que cela puisse paraître, dans mon cas, le problème était cette ligne: app: actionViewClass = "Android.widget.SearchView" dans menu.xml:

 <item
        Android:id="@+id/action_search"
        app:actionViewClass="Android.widget.SearchView"
        Android:icon="@drawable/ic_search"
        Android:title="@string/title"
        app:actionLayout="@layout/layout_search"
        app:showAsAction="always" />

Lorsque j'ai supprimé app: actionViewClass , il s'est complètement développé comme défini dans mon fichier layout_search.

<Android.support.v7.widget.SearchView xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:maxWidth="10000dp"
Android:layout_centerInParent="true"
Android:background="@color/colorAccent"
Android:queryHint="Search me" />
0
daneejela