Tap en dehors de edittext pour perdre son focus

Je veux juste quand cliquer en dehors du "edittext" pour perdre automatiquement l'accent et cacher le clavier. En ce moment, si je clique sur le "edittext", il se concentre, mais je dois frapper le bouton de retour pour me décocher.

  • Qt Haptic Feedback sur Android
  • Comment ajouter une balise d'application personnalisée dans l'application native de contact Android?
  • Comment faire pour compter les éléments de listes de Listview?
  • LLDB: ajouter un fichier de symboles?
  • Comment arrêter HttpURLConnection.getInputStream ()?
  • Forcer l'action Bar afficher la vue de recherche
  • Android déplace l'arrière-plan continuellement avec l'animation
  • Comment éviter les ressources inutilisées et le code d'un projet de bibliothèque Android dans mon APK?
  • Comment trouver les applications actuellement en cours d'exécution dans Android?
  • Référentiel de périphériques virtuels Android
  • En utilisant get () et put () pour accéder aux valeurs de pixel dans OpenCV pour Java
  • Android - IllegalStateException: la carte n'a aucune taille
  • 6 Solutions collect form web for “Tap en dehors de edittext pour perdre son focus”

    Supposons que votre EditText soit placé sur une mise en page linéaire ou un autre ViewGroup. Ensuite, vous devez rendre ce conteneur clickable, focusable et focusableInTouchMode. Après cela, définissez onClickListener dans ce conteneur avec le code suivant dans la méthode onClick Override:

    @Override public void onClick(View view) { InputMethodManager imm = (InputMethodManager) view.getContext() .getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(view.getWindowToken(), 0); } 

    @woodshy a la réponse pour cacher le clavier, mais peut-être mettre le code dans onClick n'est pas aussi bon que de le mettre onFocusChanged . En ce qui concerne le fait de la forcer à perdre de l'accent, vous devez définir l'objet sur lequel vous souhaitez transférer la mise au point dans son fichier XML:

     android:focusable="true" android:focusableInTouchMode ="true" 

    Pour résoudre ce problème, vous devez d'abord utiliser setOnFocusChangeListener de Edittext

     edittext.setOnFocusChangeListener(new View.OnFocusChangeListener() { @Override public void onFocusChange(View v, boolean hasFocus) { if (!hasFocus) { Log.d("focus", "focus loosed"); // Do whatever you want here } else { Log.d("focus", "focused"); } } }); 

    Et ensuite, ce que vous devez faire est de remplacer dispatchTouchEvent dans l'activité qui contient Edittext voir le code ci-dessous

     @Override public boolean dispatchTouchEvent(MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_DOWN) { View v = getCurrentFocus(); if ( v instanceof EditText) { Rect outRect = new Rect(); v.getGlobalVisibleRect(outRect); if (!outRect.contains((int)event.getRawX(), (int)event.getRawY())) { Log.d("focus", "touchevent"); v.clearFocus(); InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(v.getWindowToken(), 0); } } } return super.dispatchTouchEvent(event); } 

    Maintenant, ce qui se passera, c'est quand un utilisateur clique en dehors, d'abord, ce dispatchTouchEvent sera appelé, ce qui effacera la discussion à partir du editext. Maintenant, votre OnFocusChangeListener sera appelé, cette focalisation a été changée, maintenant, vous pouvez faire tout ce que vous vouliez faire, espérons Ça marche 🙂

    J'ai donc cherché un peu, et aucune autre solution n'était exactement ce que je cherchais. À mon avis, la mise au point se comporte de manière étrange sur les vues EditText.

    Ce que j'ai fait était …

    1. Assurez-vous que la vue racine est une couche RelativeLayout

    2. Ajoutez une disposition de superposition qui est OVER sur la zone qui fera disparaître le clavier, mais pas le EditText. Voici quelque chose comme ci-dessous:

    Dans mon cas, EditText était dans un conteneur en bas de l'écran. De sorte qu'il couvrait tout le reste.

    1. Avoir une méthode qui ressemble un peu à ceci:
         Private void hideKeyboard () {
             Final InputMethodManager imm = (InputMethodManager) getSystemService (Context.INPUT_METHOD_SERVICE);
             Imm.hideSoftInputFromWindow (editText.getWindowToken (), 0);
             KeyboardOverlay.setVisibility (View.GONE);
             EditText.clearFocus ();
         }
    
    1. Appelez maintenant cette méthode sur le clic sur la superposition que vous avez créée.

    2. Ce que nous voulons maintenant, c'est de rendre la superposition visible lorsque vous appuyez sur EditText. Vous ne pouvez pas utiliser l'événement onFocus (au moins, je n'ai pas réussi à travailler …) Donc, ce que j'ai fait, c'est que j'ai géré l'événement onTouch à la place.

     EditText.setOnTouchListener (new OnTouchListener () {
    
         @Passer outre
         Public boolean onTouch (vue finale v, événement final MotionEvent) {
             KeyboardOverlay.setVisibility (View.VISIBLE);
             EditText.requestFocus ();
             Renvoyer faux;
         }
     });
    

    La requêteFocus () ici est de ne pas annuler l'événement de mise au point avec l'OnTouch.

    Des conseils rapides, lorsque vous essayez cela, vous pouvez ajouter une couleur d'arrière-plan à la superposition pour voir exactement ce qui se passe.

    J'espère que ça marche pour toi!

    Le code suivant fonctionne parfaitement pour moi, et je l'utilise régulièrement pour fermer SoftKeyboard onTouch n'importe où en dehors du EditText.

     public void hideSoftKeyboard() { //Hides the SoftKeyboard InputMethodManager inputMethodManager = (InputMethodManager) getActivity().getSystemService(Activity.INPUT_METHOD_SERVICE); inputMethodManager.hideSoftInputFromWindow(getActivity().getCurrentFocus().getWindowToken(), 0); } public void setupUI(View view) { String s = "inside"; //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(); 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, il vous suffit d'appeler la fonction setupUI() une fois dans votre méthode onCreate() et voilla, votre système cachéSoftKeyboard est configuré!

    Pour perdre la totalité de l'objet du EditText, il suffit d' editText.clearFocus() dans votre fonction hideSoftKeyboard ().

    J'ai eu la même exigence que je devais cacher le clavier une fois que je touchais n'importe où en dehors de ma zone EditText. Le setOnFocusChangeListener ne fait pas le travail car même si vous touchez en dehors de la zone de texte d'édition est toujours sélectionné.

    Pour cela, j'ai utilisé la solution edc598 ici .

    • J'ai d'abord obtenu le MainLayout contenant toute la vue et j'ajoute un auditeur tactile.
    • Lorsque l'événement onTouch a été déclenché, je vérifie si la zone EditText a la mise au point.
    • Si la zone EditText a la mise au point, je vérifie les coordonnées XY de l'événement.
    • Sur la base du placement de ma boîte EditText, je cache le clavier s'il est touché n'importe où en dehors de la boîte

    Exemple de code modifié à partir d' ici :

     LinearLayout MainLayout = (LinearLayout) findViewById(R.id.MainLayout); EditText textBox = (EditText) findViewById(R.id.textBox); int X_TOP_LEFT = 157; int Y_TOP_LEFT = 388; int X_BOTTOM_RIGHT = 473; int Y_BOTTOM_RIGHT = 570; MainLayout.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { // TODO Auto-generated method stub if(textBox.isFocused()){ Log.i("Focussed", "--" + event.getX() + " : " + event.getY() + "--"); if(event.getX() <= 157 || event.getY() <= 388 || event.getX() >= 473 || event.getY() >= 569){ //Will only enter this if the EditText already has focus //And if a touch event happens outside of the EditText textBox.clearFocus(); InputMethodManager imm = (InputMethodManager) v.getContext().getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(v.getWindowToken(), 0); //Do something else } } Log.i("XY coordinate", "--" + event.getX() + " : " + event.getY() + "--"); //Toast.makeText(getBaseContext(), "Clicked", Toast.LENGTH_SHORT).show(); return false; } }); 
    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.