Discuter du clavier lorsque vous cliquez sur l'extérieur de EditText dans Android

J'ai un EditText appelé myTextview . Je veux que le clavier programmable s'affiche lorsque je clique sur EditText mais que je le EditText si je clique sur le EditText . Donc, j'utilise la méthode ci-dessous. Mais le clavier ne se désiste pas lorsque je clique en dehors de la vue (je clique sur un TextView ). Comment puis-je corriger ce code?

 myTextview.setOnFocusChangeListener(new OnFocusChangeListener() { @Override public void onFocusChange(View v, boolean hasFocus) { if (hasFocus) { getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE); } else { InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(myTextview.getWindowToken(), 0); } } }); 

  • Comment annuler Toast
  • Existe-t-il un moyen plus sécurisé de stocker des chaînes sensibles dans un projet Android?
  • Comment accéder au système de fichiers Android depuis la ligne de commande Windows 7 via USB
  • EglMakeCurrent a échoué EGL_BAD_ALLOC
  • ScrollingViewBehavior pour ListView
  • Comment passer l'intention avec des extras à une activité déjà en cours d'exécution
  • Comment utiliser relativelayout.setBackgroundDrawable () avec un bitmap?
  • Rédaction d'un fichier sur sdcard
  • Ensemble Android non débobable
  • Détectez la mise à niveau de l'application Android et définissez la classe d'application booléenne pour afficher / masquer les EULA
  • Convertisseur personnalisé pour rétrofit
  • Exemple d'intégration de GreenDAO avec Sqlcipher
  • 5 Solutions collect form web for “Discuter du clavier lorsque vous cliquez sur l'extérieur de EditText dans Android”

    J'ai trouvé une meilleure solution:

     @Override public boolean dispatchTouchEvent(MotionEvent ev) { View v = getCurrentFocus(); if (v != null && (ev.getAction() == MotionEvent.ACTION_UP || ev.getAction() == MotionEvent.ACTION_MOVE) && v instanceof EditText && !v.getClass().getName().startsWith("android.webkit.")) { int scrcoords[] = new int[2]; v.getLocationOnScreen(scrcoords); float x = ev.getRawX() + v.getLeft() - scrcoords[0]; float y = ev.getRawY() + v.getTop() - scrcoords[1]; if (x < v.getLeft() || x > v.getRight() || y < v.getTop() || y > v.getBottom()) hideKeyboard(this); } return super.dispatchTouchEvent(ev); } public static void hideKeyboard(Activity activity) { if (activity != null && activity.getWindow() != null && activity.getWindow().getDecorView() != null) { InputMethodManager imm = (InputMethodManager)activity.getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(activity.getWindow().getDecorView().getWindowToken(), 0); } } 

    Ceci est applicable même si vous travaillez avec webview.

    Police: http://kuznetsow.com/?p=196&lang=fr

    Peut-être un peu plus facile:

    Réglez un focusChangedListener sur votre texte d'édition, puis supprimez le clavier si vous n'avez pas le focus.

     yourEditText.setOnFocusChangeListener(new OnFocusChangeListener() { @Override public void onFocusChange(View v, boolean hasFocus) { if(!hasFocus){ hideKeyboard(); } } }); private void hideKeyboard() { InputMethodManager imm = (InputMethodManager)context.getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(yourEditText.getWindowToken(), 0); } 

    Utilisez le code suivant.

     public static void hideSoftKeyboard(Activity activity) { InputMethodManager inputMethodManager = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE); inputMethodManager.hideSoftInputFromWindow(activity.getCurrentFocus().getWindowToken(), 0); } 

    Ça fonctionne pour moi.

    De cette façon, le clavier ne disparaîtra que si vous touchez une vue qui peut être focalisée. Je vous suggère de faire ce qui suit:

    Créez un ViewGroup personnalisé comme ceci:

     public class TouchLayout extends LinearLayout { private OnInterceptTouchEventListener mListener; public TouchLayout(Context context, AttributeSet attrs) { super(context, attrs); } @Override public boolean onInterceptTouchEvent(MotionEvent event) { if(mListener != null) { return mListener.onInterceptTouchEvent(event); } return super.onInterceptTouchEvent(event); } public void setOnInterceptTouchEventListener(OnInterceptTouchEventListener listener) { mListener = listener; } public interface OnInterceptTouchEventListener { public boolean onInterceptTouchEvent(MotionEvent event); } } 

    Ajoutez ensuite la vue personnalisée comme une racine de votre mise en page xml:

     <com.example.TouchLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/root" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <EditText android:id="@+id/text" android:layout_width="wrap_content" android:layout_height="wrap_content" /> 

    Et dans votre activité, vous devriez faire ce qui suit:

     final TouchLayout root = (TouchLayout) findViewById(R.id.root); final EditText text = (EditText) findViewById(R.id.text); final InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); root.setOnInterceptTouchEventListener(new OnInterceptTouchEventListener() { @Override public boolean onInterceptTouchEvent(MotionEvent event) { final View v = getCurrentFocus(); if(v != null && v.equals(text)) { final int screenCords[] = new int[2]; text.getLocationOnScreen(screenCords); final Rect textRect = new Rect(screenCords[0], screenCords[1], screenCords[0] + text.getWidth(), screenCords[1] + text.getHeight()); if(!textRect.contains(event.getRawX(), event.getRawY() { imm.hideSoftInputFromWindow(myTextview.getWindowToken(), 0); // Optionally you can also do the following: text.setCursorVisible(false); text.clearFocus(); } } return false; } }; 

    Plea: Je reconnais que je n'ai pas d'influence, mais prenez ma réponse au sérieux.

    Problème: Discutez du clavier doux lorsque vous cliquez sur le clavier ou modifiez le texte avec un code minimal.

    Solution: bibliothèque externe connue sous le nom de Butterknife.

    One Line Solution:

     @OnClick(R.id.activity_signup_layout) public void closeKeyboard() { ((InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE)).hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0); } 

    Solution plus lisible:

     @OnClick(R.id.activity_signup_layout) public void closeKeyboard() { InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0); } 

    Explication: Liez OnClick Listener à l'ID parent de la mise en page XML de l'activité, de sorte que tout clic sur la mise en page (et non sur le texte ou le clavier d'édition) exécutera l'extrait de code qui cachera le clavier.

    Exemple: si votre fichier de mise en page est R.layout.my_layout et votre identifiant de mise en page est R.id.my_layout_id, votre appel de liaison Butterknife devrait ressembler à:

     (@OnClick(R.id.my_layout_id) public void yourMethod { InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0); } 

    Documentation de Butterknife Lien: http://jakewharton.github.io/butterknife/

    Plug: Butterknife va révolutionner votre développement Android. Considère-le.

    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.