Désactiver le clavier sur EditText

je fais une calculatrice. Donc j'ai fait mon propre Buttons avec des nombres et des fonctions. L'expression qui doit être calculée, est dans un EditText , parce que je veux que les utilisateurs peuvent ajouter des nombres ou des fonctions aussi au milieu de l'expression, ainsi avec le EditText j'ai le cursor . Mais je veux désactiver le Keyboard lorsque les utilisateurs cliquent sur la EditText . J'ai trouvé cet exemple que c'est ok pour Android 2.3 , mais avec ICS désactiver Keyboard et aussi 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 ce NoImeEditText dans mon XML fichier

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

comment je peux rendre compatible ce texte D'édition avec ICS??? Grâce.

46
demandé sur Darshan Rivka Whittle 2012-05-17 17:25:18

13 réponses

Ici est un site qui va vous donner ce dont vous avez besoin

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

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

voici un exemple pour consommer 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. Cela prétend fonctionner, mais semble être une mauvaise idée puisque votre boîte D'édition est nulle 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
}
});

Espère que cela vous mène dans la bonne direction

35
répondu Hip Hip Array 2012-05-17 13:28:11

ci-dessous code is both for API >= 11 and 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);
    }
}
56
répondu Aleksey Malevaniy 2015-09-22 04:27:30

, essayez: android:editable="false" ou android:inputType="none"

20
répondu K_Anas 2012-05-17 14:40:14

vous pouvez également utiliser setShowSoftInputOnFocus (booléen) 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
    }
}
10
répondu kuelye 2016-03-11 08:40:06

désactiver le clavier (API 11 à présent)

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

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 le InputType à 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 cette Q & R pour savoir pourquoi la version pré API 21 compliquée est nécessaire pour annuler setTextIsSelectable(true) :

cette réponse doit être testée de manière plus approfondie.

j'ai testé le setShowSoftInputOnFocus sur des API supérieures, mais après le commentaire de @androiddddeveloper ci-dessous, je vois que cela doit être testé plus en détail.

voici du code à couper-coller pour aider à tester cette réponse. Si vous pouvez confirmer que cela fonctionne ou non pour L'API 11 à 20, veuillez laisser un commentaire. Je n'ai pas de périphériques 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>

activité principale.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
répondu Suragch 2017-07-24 09:49:08
// 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);
6
répondu Abel Terefe 2013-03-12 12:52:10

rassembler 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ù sur votre activité, vous pouvez simplement utiliser les drapeaux suivants qui sont utilisés pour les dialogues (tiré de ici ) :

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

si vous ne le voulez pas seulement pour un texte D'édition 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 ce (extrait de ici ) :

 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
           editText.setShowSoftInputOnFocus(false);
       else
           editText.setTextIsSelectable(true); 
6
répondu android developer 2017-07-24 07:27:24

j'ai trouvé cette solution qui fonctionne pour moi. Il place également le curseur, lorsque cliqué sur EditText à la bonne position.

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
répondu Vijay 2015-05-19 16:21:33

Juste

 NoImeEditText.setInputType(0);

ou dans le constructeur:

   public NoImeEditText(Context context, AttributeSet attrs) { 
          super(context, attrs);   
          setInputType(0);
       } 
4
répondu Alex Kucherenko 2012-05-17 13:35:17

ajouter les propriétés ci-dessous au contrôleur Edittext dans le fichier layout

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

j'utilise cette solution depuis longtemps et elle fonctionne très bien pour moi.

4
répondu Nishara MJ 2018-06-27 08:09:01

pour ajouter à la solution D'Alex Kucherenko: le problème avec la disparition du curseur après avoir appelé setInputType(0) est dû à un bug de cadre sur ICS (et JB).

le bug 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, il suffit de surcharger OnTouchListener de l'EditText et de renvoyer la valeur true (avaler la touche event):

ed.setOnTouchListener(new OnTouchListener() {

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

                return true;
            }
        });

les raisons pour lesquelles le curseur apparaît sur les appareils GB et non sur ICS+ m'ont fait arracher les cheveux pendant quelques heures, donc j'espère que cela fera gagner du temps à quelqu'un.

3
répondu Jay Sidri 2013-06-08 14:07:56

ça a marché pour moi. Ajoutez d'abord ce android:windowSoftInputMode="stateHidden" dans votre fichier Android manifest, sous votre activité. comme ci-dessous:

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

ensuite, sur la méthode de création de votre activité, ajouter 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;
    }
});

alors si vous voulez que le pointeur soit visible, ajoutez ceci sur votre xml android:textIsSelectable="true" .

cela rendra le pointeur visible. De cette façon, le clavier ne s'affichera pas lorsque votre activité commence et aussi sera caché lorsque vous cliquez sur edittext.

1
répondu Jerin A Mathews 2018-04-24 15:37:34

mettez cette ligne à l'intérieur de l'étiquette d'activité dans le manifeste android: windowSoftInputMode= "stateHidden"

1
répondu mahmoud alaa 2018-07-03 11:07:48