J'ai une barre d'action contenant une searchview
. Lorsque l'utilisateur clique sur le bouton de recherche et réduit la vue de recherche, la barre d'actions affiche un bouton de retour sur le côté gauche.
Comment pouvons-nous détecter quand l'utilisateur clique sur ce bouton de retour?
Modifier
sur la base de la réponse, j’ai vérifié ma OnOptionsItemSelected
mais elle n’appelle pas trop. Voici le code de ma OnOptionsItemSelected
:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (item != null && id == Android.R.id.home) {
if (mNavigationDrawerFragment.isDrawerOpen(Gravity.RIGHT)) {
mNavigationDrawerFragment.closeDrawer(Gravity.RIGHT);
} else {
mNavigationDrawerFragment.openDrawer(Gravity.RIGHT);
}
return true;
}
if (id == R.id.action_search) {
return true;
}
return super.onOptionsItemSelected(item);
}
Mettez ceci sur la méthode onCreateOptionsMenu:
MenuItemCompat.setOnActionExpandListener(menu.findItem(R.id.action_search), new MenuItemCompat.OnActionExpandListener() {
@Override
public boolean onMenuItemActionExpand(MenuItem item) {
return true;
}
@Override
public boolean onMenuItemActionCollapse(MenuItem item) {
//DO SOMETHING WHEN THE SEARCHVIEW IS CLOSING
return true;
}
});
Vous devez ajouter les métadonnées de votre fichier manifest.xml pour quelle activité vous le souhaitez.
Comme
<activity
Android:name=".Example"
Android:label="@string/Example"
Android:theme="Theme.AppCompat.Light">
<meta-data
Android:name="Android.support.PARENT_ACTIVITY"
Android:value=".MainActivity" />
</activity>
et votre code devrait être comme ça dans l'exemple
@Override
protected void onCreate(Bundle savedInstanceState) {
.......
getActionBar().setDisplayHomeAsUpEnabled(true);
......
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
// Respond to the action bar's Up/Home button
case Android.R.id.home:
NavUtils.navigateUpFromSameTask(this);
return true;
}
return super.onOptionsItemSelected(item);
}
Suffit de remplacer la méthode ci-dessous.
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case Android.R.id.home:
//do whatever you want to do here.
}
return true;
}
Essayez ceci: plutôt que d’utiliser onOptionsItemSelected pour détecter le changement de recherche, utilisez OnQueryTextListener. OnQueryTextChanged sera ensuite appelé avec le bouton Précédent (et à tout autre moment où le texte de la requête sera modifié).
Lorsque vous configurez votre menu, attribuez à searchView le listener. Le onQueryTextChange sera appelé chaque fois que les critères de recherche changent (sur n'importe quel clavier, à l'exception du bouton de recherche), et il sera appelé avec une chaîne vide lorsque le bouton de retour sera enfoncé. Le onQueryTextSubmit sera appelé lorsque le bouton de recherche sera appuyé sur le clavier.
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
final SearchView searchView = (SearchView)menu.findItem(R.id.action_search).getActionView();
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String s) {
Log.i(TAG,"onQueryTextSubmit: " + s);
searchView.clearFocus();
return true;
}
@Override
public boolean onQueryTextChange(String s) {
Log.i(TAG,"onQueryTextChange: " + s);
FragmentManager fragmentManager = getSupportFragmentManager();
Fragment fragment = fragmentManager.findFragmentByTag(currentFragmentTag);
if (fragment.getClass().getName().startsWith("com.mydomain.myapp.mainactivity.MyFragment")) {
if (s.isEmpty()) {
((SingleICPListFragment)fragment).clearSearchCriteria();
} else {
((SingleICPListFragment) fragment).applySearchCriteria(s);
}
}
return true;
}
});
SearchManager searchManager = (SearchManager)getSystemService(Context.SEARCH_SERVICE);
searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
return true;
}