Je développe une application dans laquelle l'utilisateur appuie sur l'icône "Rechercher" dans la ActionBar
et une SearchView
est rendue visible en haut de l'écran.
Mon problème est que la SearchView
n'est pas au point ni développée, de sorte que l'utilisateur doit appuyer sur le bouton de recherche de la Searchview
pour le faire se développer et faire ressortir le clavier.
Comment cela devrait-il être résolu?
Pour développer le SearchView développé par défaut, appelez setIconifiedByDefault(false)
lors de son initialisation (par exemple, dans onCreateOptionsMenu(..)
ou onPrepareOptionsMenu(..)
). J'ai trouvé dans la plupart des cas que cela lui donnerait le focus automatiquement, mais sinon, appelez simplement requestFocus()
dessus aussi.
Vous pouvez également appeler la méthode expandActionView () afin de la forcer:
@Override
public boolean onCreateOptionsMenu( Menu menu )
{
super.onCreateOptionsMenu( menu );
MenuItem searchMenuItem = menu.findItem( R.id.mi_search ); // get my MenuItem with placeholder submenu
searchMenuItem.expandActionView(); // Expand the search menu item in order to show by default the query
return true;
}
Elément de recherche dans la présentation de la barre d’actions:
<item
Android:id="@+id/mi_search"
Android:icon="@drawable/abs__ic_search_api_holo_light"
Android:title="@string/search"
Android:showAsAction="ifRoom|collapseActionView"
Android:actionViewClass="com.actionbarsherlock.widget.SearchView"
/>
Si vous voulez l'avoir iconifiedByDefault
, cela a fonctionné pour moi. setFocusable
et setIconified
sont nécessaires.
SearchView searchView = (SearchView) menu.findItem(R.id.action_search).getActionView();
searchView.setIconifiedByDefault(true);
searchView.setFocusable(true);
searchView.setIconified(false);
searchView.requestFocusFromTouch();
Mise à jour: Si vous utilisezAndroid.support.v7.widget.SearchView
le comportement nous est très différent. clearFocus
est nécessaire si vous ne souhaitez pas que le clavier s'affiche tout le temps. Pour une raison quelconque, le menu est recréé tout le temps, lorsque vous utilisez appcompat.
SearchView searchView = (SearchView) menu.findItem(R.id.action_search).getActionView();
searchView.setIconified(false);
searchView.clearFocus();
Si vous l'utilisez dans la mise en page, vous pouvez appeler
mSearchView.onActionViewExpanded()
Cela a fonctionné pour moi:
Dans la mise en page racine:
xmlns:app="http://schemas.Android.com/apk/res-auto"
SearchView défini comme suit:
<Android.support.v7.widget.SearchView
Android:id="@+id/search_contacts"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:layout_gravity="center_horizontal"
Android:layout_margin="15dp"
Android:background="@drawable/search_view"
app:iconifiedByDefault="false"
app:queryHint="Search name or email"
>
<requestFocus />
</Android.support.v7.widget.SearchView>
La différence est avec tag app.
app:iconifiedByDefault="false"
app:queryHint="Search name or email"
Cela a fonctionné pour moi:
menu.expandActionView();
Si vous utilisez dans une activité, vous devez utiliser
view.onActionViewExpanded();
si vous utilisez des options de menu internes, vous devez utiliser
MenuItem.expandActionView();
Remarque: cela ne fonctionne que pour SearchView
ces deux situations sont travaillées pour moi.
Vous pouvez utiliser la méthode SearchView#setIconified()
sur un descripteur SearchView dans votre code Java. Plus ici:
http://developer.Android.com/reference/Android/widget/SearchView.html#setIconified(boolean)
Vous pouvez également utiliser SearchView#setIconifiedByDefault()
. Plus d'infos ici:
http://developer.Android.com/reference/Android/widget/SearchView.html#setIconifiedByDefault(boolean)
utilisez ceci
SearchManager searchManager = (SearchManager) mActivity.getSystemService(Context.SEARCH_SERVICE);
SearchView searchView = new SearchView(mActivity.actionBar.getThemedContext());
searchView.setSearchableInfo(searchManager.getSearchableInfo(mActivity.getComponentName()));
searchView.setIconifiedByDefault(false);
searchView.setQueryHint("Search");
menu.findItem(R.id.action_search).setActionView(searchView);
La réponse de @ Pascalius a fonctionné pour moi. Mais chaque fois que vous fermez SearchView, et cliquez à nouveau, vous perdez le focus. J'ai donc inséré le code dans une setOnMenuItemClickListener
comme ceci:
MenuItem item = menu.findItem(R.id.action_search);
SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
final SearchView searchView = (SearchView) item.getActionView();
item.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem menuItem) {
searchView.setIconifiedByDefault(true);
searchView.setFocusable(true);
searchView.setIconified(false);
searchView.requestFocusFromTouch();
return false;
}
});
Android:iconifiedByDefault="true"
dans votre fichier xml
J'utilise Android.widget Searchview et iconifié par défaut. Le code ci-dessous en xml m'a aidé à le développer et à l'autofocus en mode recherche, lorsque l'utilisateur clique dessus:
<SearchView
Android:id="@+id/searchView"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:iconifiedByDefault="true"
Android:focusable="true"
Android:focusableInTouchMode="true"
Android:queryHint="Search"/>
SearchView de MenuItemCompat a une propriété nommée maxWidth.
final MenuItem searchItem = menu.findItem(R.id.action_search);
final SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchItem);
searchView.setMaxWidth(xxx);
utiliser la largeur de l'écran au lieu de xxx hors cours
Pour Appcompat Searchview, vous pouvez utiliser cette méthode:
MenuItemCompat.expandActionView(mSearchMenuItem);