dans mon application, je fais un interface de recherche dans laquelle le Lorsque vous appuyez sur le bouton arrière. P> LI>
Lorsque l'icône de la maison à côté de la recherche code> est enfoncée. p> li>
ol>
Je veux que cela perde la mise au point (et donc effondrer) si l'utilisateur clique non seulement sur ces deux choses, mais n'importe où ailleurs à l'écran (par exemple, n'importe quel bouton ou une partie vide de l'écran sans vue sur elle). p> SearchView CODE> s'effondre et se développe lorsqu'il perd et gagne la mise au point respectivement. Cependant, la perte de concentration perdante ne se produit que dans deux cas: p>
4 Réponses :
Eh bien, j'ai découvert la solution suivante. J'ai utilisé Setontouchlistener sur chaque point de vue qui n'est pas une instance de Rechercheview pour réduire la recherche. Cela a fonctionné parfait pour moi. Voici le code.
public void setupUI(View view) { if(!(view instanceof SearchView)) { view.setOnTouchListener(new OnTouchListener() { public boolean onTouch(View v, MotionEvent event) { searchMenuItem.collapseActionView(); return false; } }); } //If a layout container, iterate over children and seed recursion. if (view instanceof ViewGroup) { for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) { View innerView = ((ViewGroup) view).getChildAt(i); setupUI(innerView); } } }
Donc, vous définissez un auditeur tactile sur chaque vue de la hiérarchie, à l'exception de la vue de recherche? Et si elles ont déjà des auditeurs touchées?
Cela fonctionne pour moi, MOPTIONSMENU est enregistré à OncreateOptionsMenu:
public void setupUI(View view) { //Set up touch listener for non-text box views to hide keyboard. if(!(view instanceof EditText)) { view.setOnTouchListener(new View.OnTouchListener() { public boolean onTouch(View v, MotionEvent event) { hideSoftKeyboard(MainActivity.this); if(mOptionsMenu == null) return false; MenuItem searchMenuItem = mOptionsMenu.findItem(R.id.action_search); if(searchMenuItem == null) return false; ((SearchView)searchMenuItem.getActionView()).clearFocus(); return false; } }); } //If a layout container, iterate over children and seed recursion. if (view instanceof ViewGroup) { for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) { View innerView = ((ViewGroup) view).getChildAt(i); setupUI(innerView); } } } public static void hideSoftKeyboard(Activity activity) { InputMethodManager inputMethodManager = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE); inputMethodManager.hideSoftInputFromWindow(activity.getCurrentFocus().getWindowToken(), 0); }
Eh bien, j'ai une autre façon plus simple et plus net de le faire. Si vous utilisez un widget de recherche comme une vue d'action dans la barre d'outils ( https : //developer.android.com/guide/topics/search/search-dialog#UsingSearchWidget ), vous pouvez faire la mise au point et SearchView lose cacher le clavier lorsque l'utilisateur touche nulle part ailleurs sur l'écran
Étape 1: la vue parent (afficher le contenu de votre activité) cliquable et focalisable en ajoutant l'attribut suivant strong> p> @Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_main, menu);
final MenuItem search = menu.findItem(R.id.action_search);
SearchView searchView = (SearchView) search.getActionView();
// get a reference of the AutoCompleteTextView from the searchView
AutoCompleteTextView searchSrcText = searchView.findViewById(android.support.v7.appcompat.R.id.search_src_text);
searchSrcText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if (!hasFocus) {
InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE);
inputMethodManager.hideSoftInputFromWindow(v.getWindowToken(), 0);
}
}
});
return super.onCreateOptionsMenu(menu);
}
Dans mon cas, j'ai dû arrêter la recherche et fermer le clavier, chaque fois que l'utilisateur clique sur une autre vue, cela a fonctionné pour moi.