web-dev-qa-db-fra.com

Désactiver le clavier sur EditText

Je fais une calculatrice . J'ai donc créé ma propre Buttons avec des nombres et des fonctions . L'expression devant être calculée est dans une EditText, car je veux que les utilisateurs puissent ajouter des nombres ou des fonctions également au milieu. de l'expression, donc avec le EditText j'ai le cursor. Mais je veux désactiver la Keyboard lorsque les utilisateurs cliquent sur la EditText. J'ai trouvé cet exemple que c'est correct pour Android 2.3, mais avec ICS, désactivez la Keyboard et le curseur.

public class NoImeEditText extends EditText {

   public NoImeEditText(Context context, AttributeSet attrs) { 
      super(context, attrs);     
   }   

   @Override      
   public boolean onCheckIsTextEditor() {   
       return false;     
   }         
}

Et puis j'utilise cette NoImeEditText dans mon fichier XML

<com.my.package.NoImeEditText
      Android:id="@+id/etMy"
 ....  
/>

Comment je peux rendre compatible cet EditText avec ICS ??? Merci.

51
Ferox

Ici est un site Web qui vous donnera ce dont vous avez besoin

En résumé, il fournit des liens vers InputMethodManager et View à partir de développeurs Android. Il fera référence à getWindowToken à l'intérieur de View et hideSoftInputFromWindow() pour InputMethodManager

Une meilleure réponse est donnée dans le lien, espérons que cela aide.

voici un exemple d'utilisation de l'événement onTouch:

editText_input_field.setOnTouchListener(otl);

private OnTouchListener otl = new OnTouchListener() {
  public boolean onTouch (View v, MotionEvent event) {
        return true; // the listener has consumed the event
  }
};

Voici un autre exemple du même site. Ceci prétend fonctionner mais semble être une mauvaise idée puisque votre EditBox est NULL, il ne sera plus un éditeur:

MyEditor.setOnTouchListener(new OnTouchListener(){

  @Override
  public boolean onTouch(View v, MotionEvent event) {
    int inType = MyEditor.getInputType(); // backup the input type
    MyEditor.setInputType(InputType.TYPE_NULL); // disable soft input
    MyEditor.onTouchEvent(event); // call native handler
    MyEditor.setInputType(inType); // restore input type
    return true; // consume touch even
  }
});

J'espère que ça vous indique la bonne direction 

39
Hip Hip Array

Le code ci-dessous concerne à la fois les API> = 11 et les API <11. Le curseur est toujours disponible.

/**
 * Disable soft keyboard from appearing, use in conjunction with Android:windowSoftInputMode="stateAlwaysHidden|adjustNothing"
 * @param editText
 */
public static void disableSoftInputFromAppearing(EditText editText) {
    if (Build.VERSION.SDK_INT >= 11) {
        editText.setRawInputType(InputType.TYPE_CLASS_TEXT);
        editText.setTextIsSelectable(true);
    } else {
        editText.setRawInputType(InputType.TYPE_NULL);
        editText.setFocusable(true);
    }
}
59
Aleksey Malevaniy

essayez: Android:editable="false" ou Android:inputType="none"

20
K_Anas

Vous pouvez également utiliser setShowSoftInputOnFocus (boolean) directement sur API 21+ ou par réflexion sur API 14+:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Lollipop) {
    editText.setShowSoftInputOnFocus(false);
} else {
    try {
        final Method method = EditText.class.getMethod(
                "setShowSoftInputOnFocus"
                , new Class[]{boolean.class});
        method.setAccessible(true);
        method.invoke(editText, false);
    } catch (Exception e) {
        // ignore
    }
}
12
kuelye

Désactiver le clavier (API 11 en cours)

C’est la meilleure réponse que j’ai trouvée jusqu’à présent pour désactiver le clavier (et j'en ai vu beaucoup). 

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Lollipop) { // API 21
    editText.setShowSoftInputOnFocus(false);
} else { // API 11-20
    editText.setTextIsSelectable(true);
}

Il n'est pas nécessaire d'utiliser la réflexion ou de définir la variable InputType sur null.

Réactiver le clavier

Voici comment réactiver le clavier si nécessaire.

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Lollipop) { // API 21
    editText.setShowSoftInputOnFocus(true);
} else { // API 11-20
    editText.setTextIsSelectable(false);
    editText.setFocusable(true);
    editText.setFocusableInTouchMode(true);
    editText.setClickable(true);
    editText.setLongClickable(true);
    editText.setMovementMethod(ArrowKeyMovementMethod.getInstance());
    editText.setText(editText.getText(), TextView.BufferType.SPANNABLE);
}

Voir ce Q & A pour savoir pourquoi la version complexe de pré API 21 est nécessaire pour annuler setTextIsSelectable(true):

Cette réponse doit être testée plus en profondeur.

J'ai testé la setShowSoftInputOnFocus sur des appareils avec une API supérieure, mais après le commentaire de @ androiddeveloper ci-dessous, je constate qu'il faut procéder à des tests plus approfondis.

Voici un code copier-coller pour vous aider à tester cette réponse. Si vous pouvez confirmer que cela fonctionne ou non pour les API 11 à 20, veuillez laisser un commentaire. Je n'ai pas de périphérique API 11-20 et mon émulateur a des problèmes.

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:id="@+id/activity_main"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:paddingBottom="@dimen/activity_vertical_margin"
    Android:paddingLeft="@dimen/activity_horizontal_margin"
    Android:paddingRight="@dimen/activity_horizontal_margin"
    Android:paddingTop="@dimen/activity_vertical_margin"
    Android:orientation="vertical"
    Android:background="@Android:color/white">

    <EditText
        Android:id="@+id/editText"
        Android:textColor="@Android:color/black"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"/>

    <Button
        Android:text="enable keyboard"
        Android:onClick="enableButtonClick"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"/>

    <Button
        Android:text="disable keyboard"
        Android:onClick="disableButtonClick"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"/>
</LinearLayout>

MainActivity.Java

public class MainActivity extends AppCompatActivity {

    EditText editText;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        editText = (EditText) findViewById(R.id.editText);
    }

    // when keyboard is hidden it should appear when editText is clicked
    public void enableButtonClick(View view) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Lollipop) { // API 21
            editText.setShowSoftInputOnFocus(true);
        } else { // API 11-20
            editText.setTextIsSelectable(false);
            editText.setFocusable(true);
            editText.setFocusableInTouchMode(true);
            editText.setClickable(true);
            editText.setLongClickable(true);
            editText.setMovementMethod(ArrowKeyMovementMethod.getInstance());
            editText.setText(editText.getText(), TextView.BufferType.SPANNABLE);
        }
    }

    // when keyboard is hidden it shouldn't respond when editText is clicked
    public void disableButtonClick(View view) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Lollipop) { // API 21
            editText.setShowSoftInputOnFocus(false);
        } else { // API 11-20
            editText.setTextIsSelectable(true);
        }
    }
}
10
Suragch

Ajoutez les propriétés ci-dessous au contrôleur Edittext dans le fichier de disposition

<Edittext
   Android:focusableInTouchMode="true"
   Android:cursorVisible="false"
   Android:focusable="false"  />

J'utilise cette solution depuis un moment et cela fonctionne bien pour moi.

6
Nishara MJ

En rassemblant des solutions de plusieurs endroits ici sur StackOverflow, je pense que le prochain résume:

Si vous n'avez pas besoin que le clavier soit affiché n'importe où dans votre activité, vous pouvez simplement utiliser les drapeaux suivants utilisés pour les dialogues (obtenus de ici ):

    getWindow().setFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM, WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);

Si vous ne le souhaitez pas uniquement pour un EditText spécifique, vous pouvez utiliser ceci (obtenu de ici ):

public static boolean disableKeyboardForEditText(@NonNull EditText editText) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Lollipop) {
        editText.setShowSoftInputOnFocus(false);
        return true;
    }
    if (Build.VERSION.SDK_INT > Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1)
        try {
            final Method method = EditText.class.getMethod("setShowSoftInputOnFocus", new Class[]{boolean.class});
            method.setAccessible(true);
            method.invoke(editText, false);
            return true;
        } catch (Exception ignored) {
        }
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2)
        try {
            Method method = TextView.class.getMethod("setSoftInputShownOnFocus", boolean.class);
            method.setAccessible(true);
            method.invoke(editText, false);
            return true;
        } catch (Exception ignored) {
        }
    return false;
}

Ou ceci (pris de ici ):

 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Lollipop)
           editText.setShowSoftInputOnFocus(false);
       else
           editText.setTextIsSelectable(true); 
6
android developer

J'ai trouvé cette solution qui fonctionne pour moi. Il place également le curseur lorsque vous cliquez sur EditText à la position correcte.

EditText editText = (EditText)findViewById(R.id.edit_mine);
// set OnTouchListener to consume the touch event
editText.setOnTouchListener(new OnTouchListener() {

        @Override
        public boolean onTouch(View v, MotionEvent event) {
            v.onTouchEvent(event);   // handle the event first
            InputMethodManager imm = (InputMethodManager)v.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
            if (imm != null) {
                imm.hideSoftInputFromWindow(v.getWindowToken(), 0);  // hide the soft keyboard 
            }                
            return true;
        }
    });
5
Vijay
// only if you completely want to disable keyboard for 
// that particular edit text
your_edit_text = (EditText) findViewById(R.id.editText_1);
your_edit_text.setInputType(InputType.TYPE_NULL);
5
Abel Terefe

Il suffit de définir:

 NoImeEditText.setInputType(0);

ou dans le constructeur:

   public NoImeEditText(Context context, AttributeSet attrs) { 
          super(context, attrs);   
          setInputType(0);
       } 
4
Alex Kucherenko

Pour ajouter à la solution Alex Kucherenko: le problème avec le curseur qui disparaît après l'appel de setInputType(0) est dû à un bogue du framework sur ICS (et JB). 

Le bogue est documenté ici: https://code.google.com/p/Android/issues/detail?id=27609

Pour contourner ce problème, appelez setRawInputType(InputType.TYPE_CLASS_TEXT) juste après l'appel setInputType

Pour empêcher le clavier d'apparaître, remplacez simplement la variable OnTouchListener de la propriété EditText et renvoyez la valeur true (en avalant l'événement tactile):

ed.setOnTouchListener(new OnTouchListener() {

            @Override
            public boolean onTouch(View v, MotionEvent event) {

                return true;
            }
        });

Les raisons pour lesquelles le curseur apparaît sur les périphériques GB et non sur ICS + m'ont obligé à me déchirer les cheveux pendant quelques heures. J'espère donc que cela fera gagner du temps à quelqu'un.

3
Jay Sidri
editText.setShowSoftInputOnFocus(false);
1
Kanagalingam

Il suffit de mettre cette ligne à l’intérieur de la balise d’activité dans le manifeste Android: windowSoftInputMode = "stateHidden"

1
mahmoud alaa

Cela a fonctionné pour moi ..__ D'abord, ajoutez ceci Android:windowSoftInputMode="stateHidden" dans votre fichier manifeste Android, sous votre activité. comme ci-dessous: 

<activity ... Android:windowSoftInputMode="stateHidden">

Ensuite, sur la méthode onCreate de votre activité, ajoutez le code suivant:

EditText editText = (EditText)findViewById(R.id.edit_text);
edit_text.setOnTouchListener(new OnTouchListener() {

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        v.onTouchEvent(event);
        InputMethodManager inputMethod = (InputMethodManager)v.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
        if (inputMethod!= null) {
            inputMethod.hideSoftInputFromWindow(v.getWindowToken(), 0);
        }                
        return true;
    }
});

Ensuite, si vous souhaitez que le pointeur soit visible, ajoutez-le à votre Android:textIsSelectable="true" xml.

Cela rendra le pointeur visible… .. De cette manière, le clavier ne s'affichera pas au début de votre activité et sera également masqué lorsque vous cliquerez sur le texte. 

1
Jerin A Mathews