web-dev-qa-db-fra.com

Comment masquer le clavier virtuel Android sur EditText

J'ai une activité avec des champs EditText et des boutons comme commodité pour ce qui serait normalement utilisé pour remplir ces champs. Cependant, lorsque l'utilisateur touche l'un des champs EditText, le clavier virtuel Android apparaît automatiquement. Je veux qu'il reste masqué par défaut, à moins que l'utilisateur appuie longuement sur le bouton de menu. J'ai cherché une solution à cela et j'ai trouvé plusieurs réponses, mais je ne peux pas les faire fonctionner jusqu'à présent.

J'ai essayé ce qui suit:

1 - Dans la méthode onCreate,

this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);

2 - Toujours dans la méthode onCreate,

InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(editText.getWindowToken(), InputMethodManager.HIDE_IMPLICIT_ONLY);

3 - et dans le fichier Manifest,

<activity Android:name=".activityName" Android:windowSoftInputMode="stateAlwaysHidden"/>

Aucune de ces méthodes ne fonctionne. Chaque fois que l'utilisateur clique sur le champ EditText, le clavier virtuel apparaît. Je veux seulement que le clavier logiciel apparaisse si l'utilisateur le montre explicitement en appuyant longuement sur la touche Menu.

Pourquoi ça ne marche pas?

43
ScubaSteve

Cela vous aidera

editText.setInputType(InputType.TYPE_NULL);

Modifier:

Pour afficher le clavier virtuel, vous devez écrire le code suivant dans long key press event of menu button

editText.setInputType(InputType.TYPE_CLASS_TEXT);
            editText.requestFocus();
            InputMethodManager mgr = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
            mgr.showSoftInput(editText, InputMethodManager.SHOW_FORCED);
83
Sandy

vous devez ajouter manifeste. Votre fichier manifeste ressemblerait à ceci:

<activity
...
Android:windowSoftInputMode="stateHidden|adjustResize"
...
>
30
Emran Hamza

J'utilise parfois un truc pour faire ça. Je mets un porte-focus invisible quelque part sur le dessus de la mise en page. Ce serait par exemple comme ça

 <EditText Android:id="@id/editInvisibleFocusHolder"
          style="@style/InvisibleFocusHolder"/>

avec ce style

<style name="InvisibleFocusHolder">
    <item name="Android:layout_width">0dp</item>
    <item name="Android:layout_height">0dp</item>
    <item name="Android:focusable">true</item>
    <item name="Android:focusableInTouchMode">true</item>
    <item name="Android:inputType">none</item>
</style>

puis dans onResume j'appellerais

    editInvisibleFocusHolder.setInputType(InputType.TYPE_NULL);
    editInvisibleFocusHolder.requestFocus();

Cela fonctionne bien pour moi de 1.6 à 4.x

8
Manfred Moser

Après une longue recherche dans la classe TextView, j'ai trouvé un moyen d'empêcher le clavier d'apparaître. Le truc est de le cacher juste après son apparition, j'ai donc cherché une méthode appelée après que le clavier apparaisse et le cache.

Classe EditText implémentée

public class NoImeEditText extends EditText {

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

    /**
     * This method is called before keyboard appears when text is selected.
     * So just hide the keyboard
     * @return
     */
    @Override
    public boolean onCheckIsTextEditor() {
        hideKeyboard();

        return super.onCheckIsTextEditor();
    }

    /**
     * This methdod is called when text selection is changed, so hide keyboard to prevent it to appear
     * @param selStart
     * @param selEnd
     */
    @Override
    protected void onSelectionChanged(int selStart, int selEnd) {
        super.onSelectionChanged(selStart, selEnd);

        hideKeyboard();
    }

    private void hideKeyboard(){
        InputMethodManager imm = (InputMethodManager) getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.hideSoftInputFromWindow(getWindowToken(), 0);
    }
}

et le style

<com.my.app.CustomViews.NoImeEditText
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
    Android:editable="false"
    Android:background="@null"
    Android:textSize="@dimen/cell_text" />
7
cristianomad

Le clavier logiciel continuait à monter même si je plaçais EditorInfo.TYPE_NULL dans la vue . Aucune des réponses ne fonctionnait pour moi, à l'exception de l'idée que j'ai eu de la réponse de nik431:

editText.setCursorVisible(false);
editText.setFocusableInTouchMode(false);
editText.setFocusable(false);
6
Alex Burdusel

Il semble exister diverses méthodes permettant d’empêcher l’apparition du clavier système, à la fois par programme et en XML. Cependant, c’est la méthode qui a fonctionné pour moi tout en prenant en charge les périphériques pré-API 11.

// prevent system keyboard from appearing
if (Android.os.Build.VERSION.SDK_INT >= 11) {
    editText.setRawInputType(InputType.TYPE_CLASS_TEXT);
    editText.setTextIsSelectable(true);
} else {
    editText.setRawInputType(InputType.TYPE_NULL);
    editText.setFocusable(true);
}
2
Suragch

La ligne suivante est exactement ce qui est recherché. Cette méthode a été incluse avec API 21, donc elle fonctionne pour API 21 et les versions supérieures.

edittext.setShowSoftInputOnFocus(false);
2
Shnkc

Essayons de définir les propriétés ci-dessous dans votre code XML pour EditText 

Android:focusableInTouchMode="true" Android:cursorVisible="false".

si vous voulez masquer le clavier au lancement, veuillez passer par ceci link

1
nik431

Mon résultat de test:

avec setInputType:

editText.setInputType(InputType.TYPE_NULL);

le clavier virtuel disparaît, mais le curseur disparaît également.

avec setShowSoftInputOnFocus

editText.setShowSoftInputOnFocus(false)

Cela fonctionne comme prévu. 

1
David Guo

Utilisez simplement EditText.setFocusable(false); en activité

ou utiliser en XML

Android:focusable="false"
0
Nur Gazi

Bonjour Utilisez ce code, il fonctionne à 100% pour moi

EditText ee=new EditText(this);
ee.setShowSoftInputOnFocus(false);

* Mais vous voulez juste cacher le clavier en cliquant sur edittext, le code ci-dessous fonctionnera, mais l'icône du clavier et le signe ascendant du bouton précédent créeront * Le code est comme ça

        EditText ee=new EditText(this);//create edittext
        final   View.OnTouchListener disable =new View.OnTouchListener() {
        public boolean onTouch (View v, MotionEvent event) {
        v.onTouchEvent(event);
        InputMethodManager img = 
        (InputMethodManager)v.getContext().getSystemService(INPUT_METHOD_SERVICE);
        if (img != null) {
        img.hideSoftInputFromWindow(v.getWindowToken(),0);
        }
        return true;
        }
        };
        //call touch listener
       ee.setOnTouchListener(disable);

Utilisez-le aussi en cas d'écoute à changement de texte

        EditText ee= new EditText(this);
        Text=new TextWatcher(){

        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int 
        after) {
        InputMethodManager img = (InputMethodManager) 
        getSystemService(INPUT_METHOD_SERVICE);
        img.hideSoftInputFromWindow(ee.getWindowToken(), 0);

        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {

        InputMethodManager img = (InputMethodManager) 
        getSystemService(INPUT_METHOD_SERVICE);
        img.hideSoftInputFromWindow(ee.getWindowToken(), 0);

        }
       @Override
        public void afterTextChanged(Editable s) {
        InputMethodManager img = (InputMethodManager) 
        getSystemService(INPUT_METHOD_SERVICE);
        img.hideSoftInputFromWindow(ee.getWindowToken(), 0);

        }
        };
       ee.addTextChangedListener(Text);

Utilisez-le aussi en cas d'écoute onclick

 EditText ee=new EditText(this);
 ee.setOnClickListener(new View.OnClickListener() {
 public void onClick(View v) {

 InputMethodManager img= (InputMethodManager)getSystemService(INPUT_METHOD_SERVICE);
 img.hideSoftInputFromWindow(ee.getWindowToken(),0);

 }});

Tout le code fonctionnera mais pour moi le premier code est le meilleur

0
yashpal singh

Cacher le clavier

editText.setInputType(InputType.TYPE_NULL);

Afficher le clavier

etData.setInputType(InputType.TYPE_CLASS_TEXT);
etData.setFocusableInTouchMode(true);

dans la mise en page parent

Android:focusable="false"
0
Woz
weekText = (EditText) layout.findViewById(R.id.weekEditText);
weekText.setInputType(InputType.TYPE_NULL);
0
TOLIN THOMAS

Utilisez simplement la méthode ci-dessous 

private fun hideKeyboard(activity: Activity, editText: EditText) {
    editText.clearFocus()
    (activity.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager).hideSoftInputFromWindow(editText.windowToken, 0)
}
0
Praveen

Trois manières basées sur la même instruction simple:

une). Des résultats aussi faciles que localiser (1):

Android:focusableInTouchMode="true"

parmi la configuration de tout élément précédent dans la mise en page, exemple:

si toute votre mise en page est composée de:

<ImageView>

<EditTextView>

<EditTextView>

<EditTextView>

alors vous pouvez écrire le (1) parmi les paramètres ImageView et ceci attirera l'attention d'Android sur ImageView au lieu du texte d'édition.

b) Si vous avez un élément précédent à un ImageView, vous devrez peut-être ajouter (2) à (1) en tant que:

Android:focusable="true"

c) vous pouvez également simplement créer un élément vide en haut de votre vue:

<LinearLayout
  Android:focusable="true"
  Android:focusableInTouchMode="true"
  Android:layout_width="0px"
  Android:layout_height="0px" />

Jusque-là, cette alternative est la plus simple de toutes. J'espère que ça aide...

0
Andrew