web-dev-qa-db-fra.com

Masquer le clavier virtuel depuis EditText sans perdre le curseur

Je suis venu à peu près aussi loin que ceci qui me mène à mi-chemin, mais pas tout à fait. J'ai un numéroteur Fragment qui a tous les Buttons habituels pour entrer un numéro, y compris le retour arrière, de sorte que je n'ai pas besoin du clavier logiciel. Je voudrais également donner à l'utilisateur la possibilité de coller du texte (clic long ... ça marche bien par défaut), ainsi que de modifier ce qui a été entré pour que j'ai besoin du curseur.

Le moyen le plus simple que j'ai trouvé pour m'assurer que le clavier logiciel n'apparaît pas si l'utilisateur clique sur la variable EditText consiste à définir la variable inputType sur null - mais cela tue également le curseur.

Alors, comment déclarer ma EditText et quel type de commandes dois-je lancer pour que mon champ EditText ne montre jamais le clavier virtuel, quelles que soient les tentatives de l'utilisateur, tout en conservant la fonctionnalité de collage et le curseur?

J'ai également essayé Android:windowSoftInputMode="stateAlwaysHidden" dans mon manifeste, mais en vain.

22
user1537915

Cela a fonctionné pour moi:

        // Update the EditText so it won't popup Android's own keyboard, since I have my own.
    EditText editText = (EditText)findViewById(R.id.edit_mine);
    editText.setOnTouchListener(new OnTouchListener() {

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

J'ai enfin trouvé une solution de travail (pour moi). 

Première partie (dans onCreate):

// Set to TYPE_NULL on all Android API versions
mText.setInputType(InputType.TYPE_NULL);
// for later than GB only
if (Android.os.Build.VERSION.SDK_INT >= 11) {
    // this fakes the TextView (which actually handles cursor drawing)
    // into drawing the cursor even though you've disabled soft input
    // with TYPE_NULL
    mText.setRawInputType(InputType.TYPE_CLASS_TEXT);
}

De plus, Android: textIsSelectable doit être défini sur true (ou défini dans onCreate) et le champ EditText ne doit pas être concentré sur l'initialisation. Si votre EditText est la première vue focalisable (ce qui était dans mon cas), vous pouvez contourner ce problème en le plaçant juste au-dessus:

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

Vous pouvez en voir les résultats dans l'application Grapher, gratuite et disponible dans Google Play.

6
opticron

Définir l'indicateur textIsSelectable sur true désactive le clavier logiciel.

Vous pouvez le définir dans votre mise en page XML comme suit:

<EditText
    Android:id="@+id/editText"
    ...
    Android:textIsSelectable="true"/>

Ou par programme, comme ceci:

EditText editText = (EditText) findViewById(R.id.editText);
editText.setTextIsSelectable(true);

Le curseur sera toujours présent, vous pourrez sélectionner/copier/couper/coller mais le clavier logiciel ne s'affichera jamais.

4
Andrei Lupsa

C'est ce que j'ai fait. Premièrement, dans l'activité manifeste à l'intérieur

Android:windowSoftInputMode="stateAlwaysHidden|adjustNothing"

Deuxièmement, dans onCreate si activité interne ou onActivityCreated si dans fragment

editText.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            hideSoftKeyboard(v);
        }
    });

N'oubliez pas de demander le focus sur le editText

editText.requestFocus();

Ajoutez ensuite la méthode hideSoftKeyboard(v) comme l’autre réponse.

private void hideSoftKeyboard(View v){
    InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    inputMethodManager.hideSoftInputFromWindow(v.getWindowToken(), 0);
}

La clé ici est de demanderFocus avant de cliquer sur EditText. Si sans focus, le premier clic fera apparaître le clavier (mon expérience). Toutefois, cela s'applique si vous avez un seul EditText dans une activité. Avec cela, vous pouvez toujours taper avec un clavier personnalisé (le cas échéant), pouvez copier et coller, et le curseur est toujours visible.

3
Tuss

La fonctionnalité exacte dont vous avez besoin est fournie en définissant l'indicateur textIsSelectable dans EditText sur true. Avec cela, le curseur sera toujours présent et vous pourrez sélectionner/copier/couper/coller, mais SoftKeyboard ne s'affichera jamais} _. Nécessite l'API 11 et les versions ultérieures.

Vous pouvez le définir dans votre mise en page XML comme suit:

<EditText
    Android:textIsSelectable="true"
    ...
/>

Ou par programme, comme ceci:

EditText editText = (EditText) findViewById(R.id.editText);
editText.setTextIsSelectable(true);

Pour toute personne utilisant l’API 10 et les versions antérieures, le hack est fourni ici: https://stackoverflow.com/a/20173020/7550472

3
Kaushik NP

utilisation 

Android:windowSoftInputMode="stateHidden" 

dans votre fichier manifeste au lieu de Android:windowSoftInputMode="stateAlwaysHidden"

3
Droid Diva

Meilleure solution de @Lupsaa ici :

Définir l'indicateur textIsSelectable sur true désactive le clavier logiciel.

Vous pouvez le définir dans votre mise en page XML comme suit:

<EditText
Android:id="@+id/editText"
...
Android:textIsSelectable="true"/>

Ou par programme, comme ceci:

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

editText.setTextIsSelectable (true);

Le curseur sera toujours présent, vous pourrez sélectionner/copier/couper/coller mais le clavier logiciel ne s'affichera jamais.

2
Santacrab
    EditText text = (EditText) findViewById(R.id.text);
    if (Build.VERSION.SDK_INT >= 11) {
        text.setRawInputType(InputType.TYPE_CLASS_TEXT);
        text.setTextIsSelectable(true);
    } else {
        text.setRawInputType(InputType.TYPE_NULL);
        text.setFocusable(true);
    }
2
aikrikunov95

Ajoutez d’abord Android:windowSoftInputMode="stateHidden" dans votre fichier manifeste, sous l’activité. comme ça

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

Le sur votre XML ajouter ce Android:textIsSelectable="true". Cela rendra le pointeur visible.

Ensuite, sur la méthode onCreate de l'activité, ajoutez ceci:

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;
    }
});
1
Jerin A Mathews

Cela fonctionne parfaitement (pour moi) en 2 étapes:

  1. <activity... Android:windowSoftInputMode="stateHidden"> dans le fichier manifeste

  2. Ajoutez ces propriétés dans votre code XML editText

    Android:focusable="true"
    Android:focusableInTouchMode="true
    

Vous devez mettre les deux 1 et 2, alors seulement cela fonctionnera.

À votre santé

1
user2144695

Vous pouvez utiliser la ligne de code suivante dans la méthode onCreate de l'activité pour vous assurer que le clavier apparaît uniquement lorsqu'un utilisateur clique ou touche dans un champ EditText. J'ai essayé beaucoup de méthodes et de codes à partir de stackoverflow, mais cela n'a pas fonctionné, mais thisWorks Perfectly for me !! Essayez ceci ..:) `

 this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
0
Rohit Malavade

EditText editText = (EditText) findViewById (R.id.edit_mine); editText.setOnTouchListener (nouveau OnTouchListener () {

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

ha ... c'est la bonne façon de faire ... ce travail est fait ... ça va marcher!

0
Ajay Jain

Vous pouvez utiliser la ligne de code suivante dans la méthode onCreate de l'activité pour vous assurer que le clavier apparaît uniquement lorsqu'un utilisateur clique ou touche dans un champ EditText. J'ai essayé beaucoup de méthodes et de codes à partir de stackoverflow mais je n'ai pas fonctionné, mais cela fonctionne parfaitement pour moi !! Essayez ceci ..:) `

        this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
0
Rohit Malavade