10
votes

Comment faire de la rechercheViewer perdre concentration et effondrement lorsque vous cliquez sur Ailleurs sur l'activité

dans mon application, je fais un interface de recherche dans laquelle le SearchView 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:

  1. Lorsque vous appuyez sur le bouton arrière.

  2. Lorsque l'icône de la maison à côté de la recherche est enfoncée.

    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).


0 commentaires

4 Réponses :


10
votes

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);
        }
    }
}


1 commentaires

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?



0
votes

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);
}


0 commentaires

2
votes

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 au lieu de itérer et la mise en place d'auditeurs tactiles sur tous les plans dans la hiérarchie à l'exception du SearhView, vous pouvez simplement utiliser cette solution a > depuis le SearchView a une AutoCompleteTextView en elle. P>

É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);
}


0 commentaires

1
votes

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. XXX


0 commentaires