198 votes

Désactiver le curseur clignotant de l'EditText

Est-ce que quelqu'un sait comment désactiver le curseur clignotant dans une EditText vue ?

378voto

Vic Points 2129

Vous pouvez utiliser soit l'attribut xml android:cursorVisible="false" ou de manière programmée :

  • java : view.setCursorVisible(false)
  • kotlin : view.isCursorVisible = false

13 votes

Génial, ceci avec le onclicklistener qui le rend visible donne le comportement correct :)

1 votes

@cerin existe-t-il un moyen de cacher le marqueur bleu afin de désactiver le collage, mais de garder le curseur visible afin que l'utilisateur puisse voir où il se trouve dans le champ ?

10 votes

Est-il possible de désactiver uniquement le clignotement lui-même, et non le curseur ?

40voto

coolcool1994 Points 526

Solution parfaite qui va plus loin que l'objectif

Objectif : désactiver le curseur clignotant lorsque EditText n'est pas mise au point, et activer le curseur clignotant lorsque EditText est en ligne de mire. Below ouvre également le clavier lorsque EditText est cliqué, et le cache lorsque vous appuyez sur done dans le clavier.

1) Définissez dans votre xml sous votre EditText :

android:cursorVisible="false"

2) Définissez le récepteur onClickListener :

iEditText.setOnClickListener(editTextClickListener);

OnClickListener editTextClickListener = new OnClickListener() 

{

    public void onClick(View v) 
    {
         if (v.getId() == iEditText.getId()) 
        {
            iEditText.setCursorVisible(true);
        }

    }
};

3) alors onCreate capturer l'événement lorsque l'on appuie sur "done" en utilisant OnEditorActionListener à votre EditText et ensuite setCursorVisible(false) .

//onCreate...

iEditText.setOnEditorActionListener(new OnEditorActionListener() {

            @Override
            public boolean onEditorAction(TextView v, int actionId,
                    KeyEvent event) {
                    iEditText.setCursorVisible(false);
                if (event != null&& (event.getKeyCode() == KeyEvent.KEYCODE_ENTER)) {
                    InputMethodManager in = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                    in.hideSoftInputFromWindow(iEditText.getApplicationWindowToken(),InputMethodManager.HIDE_NOT_ALWAYS);
                }
                return false;
            }
        });

6 votes

KeyEvent.KEYCODE_ENTER ne fonctionnera pas pour tous les claviers. Vous devrez mentionner spécifiquement Android:imeOptions="actionDone" dans la mise en page, puis gérer également EditorInfo.IME_ACTION_DONE.

0 votes

Excellente réponse, mais il faudrait remplacer "on click" par "on touch", car il arrive que le texte à éditer obtienne le focus sans qu'il y ait de clic, donc dans ce cas, le curseur ne sera pas affiché.

12voto

Sagar Hudge Points 588

Vous pouvez utiliser le code suivant pour activer et désactiver le curseur d'édition de texte par programmation.

Pour activer le curseur

    editText.requestFocus();
    editText.setCursorVisible(true);

Pour désactiver le curseur

    editText.setCursorVisible(false);

Utilisation de XML pour activer ou désactiver le curseur

   android:cursorVisible="false/true"
   android:focusable="false/true"

Pour rendre l'edit_text sélectionnable à (copier/couper/coller/sélectionner/sélectionner tout)

   editText.setTextIsSelectable(true);

Pour se concentrer sur le mode tactile, écrivez les lignes suivantes dans XML

  android:focusableInTouchMode="true"
  android:clickable="true"
  android:focusable="true" 

de manière programmée

  editText.requestFocusFromTouch();

Pour effacer la mise au point en mode tactile

  editText.clearFocus()

0 votes

EditText.clearFocus() est ce que je recherchais. Merci ! +1

4voto

Ajoutez simplement cette ligne dans votre mise en page parent

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:focusable="true"
    android:focusableInTouchMode="true">

    <EditText
        android:inputType="text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</LinearLayout>

3voto

MontiRabbit Points 695

Dans mon cas, je voulais activer/désactiver le curseur lorsque l'édition est focalisée.

Dans votre activité :

@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
    if (ev.getAction() == MotionEvent.ACTION_DOWN) {
        View v = getCurrentFocus();
        if (v instanceof EditText) {
            EditText edit = ((EditText) v);
            Rect outR = new Rect();
            edit.getGlobalVisibleRect(outR);
            Boolean isKeyboardOpen = !outR.contains((int)ev.getRawX(), (int)ev.getRawY());
            System.out.print("Is Keyboard? " + isKeyboardOpen);
            if (isKeyboardOpen) {
                System.out.print("Entro al IF");
                edit.clearFocus();
                InputMethodManager imm = (InputMethodManager) this.getSystemService(Context.INPUT_METHOD_SERVICE);
                imm.hideSoftInputFromWindow(edit.getWindowToken(), 0);
            }

            edit.setCursorVisible(!isKeyboardOpen);

        }
    }
    return super.dispatchTouchEvent(ev);
}

0 votes

Je suis presque sûr que vous voulez edit.setCursorVisible(!isKeyboardOpen); pour être edit.setCursorVisible(isKeyboardOpen); afin que le curseur soit visible lorsque le clavier est présent.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X