Disabilita il cursore lampeggiante di EditText


Risposte:


355

È possibile utilizzare l'attributo xml android:cursorVisible="false"o la funzione java setCursorVisible(false).


13
Fantastico, questo insieme a onclicklistener che lo rende visibile dà il comportamento corretto :)
Warpzit

1
@cerin c'è un modo per nascondere il marcatore blu in modo che io possa disabilitare l'incolla, ma mantenere il cursore visibile in modo che l'utente possa vedere dove si trova nel campo?
limlim,

9
È possibile disabilitare solo il lampeggio stesso e non il cursore?
sviluppatore Android

35

Soluzione perfetta che va oltre l'obiettivo

Obiettivo: disabilitare il cursore lampeggiante quando EditTextnon è attivo e abilitare il cursore lampeggiante quando EditTextè attivo . Di seguito apre anche la tastiera quando si EditTextfa clic e la nasconde quando si preme Fine sulla tastiera.

1) Imposta nel tuo xml sotto EditText:

android:cursorVisible="false"

2) Imposta onClickListener:

iEditText.setOnClickListener(editTextClickListener);

OnClickListener editTextClickListener = new OnClickListener() 

{

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

    }
};

3) quindi onCreate, cattura l'evento quando finito viene premuto usando OnEditorActionListenersul tuo EditText, e poi 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
KeyEvent.KEYCODE_ENTER non funzionerà per tutte le tastiere. Dovrai menzionare specificamente android: imeOptions = "actionDone" nel layout e quindi gestire anche EditorInfo.IME_ACTION_DONE.
PsyGik,

Un'ottima risposta dovrebbe semplicemente sostituire al clic con al tocco perché un po 'di tempo modifica il testo per ottenere lo stato attivo senza fare clic, quindi in questo caso il cursore non verrà mostrato
Antwan

10

È possibile utilizzare il codice seguente per abilitare e disabilitare il cursore di modifica testo in modo programmatico.

Per abilitare il cursore

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

Per disabilitare il cursore

    editText.setCursorVisible(false);

Utilizzando XML abilitare il cursore di disabilitazione

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

Per rendere edit_text selezionabile su (copia / taglia / incolla / seleziona / seleziona tutto)

   editText.setTextIsSelectable(true);

Per concentrarti sulla modalità touch scrivi le seguenti righe in XML

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

a livello di codice

  editText.requestFocusFromTouch();

Per cancellare la messa a fuoco sulla modalità touch

  editText.clearFocus()

editText.clearFocus () è quello che stavo cercando. Grazie!! +1
iUser

3

Il problema con l'impostazione della visibilità del cursore su vero e falso può essere un problema poiché rimuove il cursore fino a quando non lo si reimposta di nuovo e allo stesso tempo il campo è modificabile, il che non è una buona esperienza utente.

quindi invece di usare

setCursorVisible(false)

fallo così

        editText2.setFocusableInTouchMode(false)
        editText2.clearFocus()
        editText2.setFocusableInTouchMode(true)

Il codice sopra rimuove il focus che a sua volta rimuove il cursore. E lo abilita di nuovo in modo da poterlo toccare nuovamente e poterlo modificare. Proprio come la normale esperienza utente.


2

Nel mio caso, volevo abilitare / disabilitare il cursore quando la modifica è focalizzata.

Nella tua attività:

@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);
}

Abbastanza sicuro di voler edit.setCursorVisible(!isKeyboardOpen);essere in edit.setCursorVisible(isKeyboardOpen);modo che il cursore sia visibile quando è presente la tastiera.
Daniel Storm,

2

aggiungi semplicemente questa riga nel layout principale

<?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>

1

Se vuoi ignorare Edittextdall'inizio dell'attività android:focusablee android:focusableInTouchModeti aiuterà a inshallah.

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/linearLayout7" android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:focusable="true" android:focusableInTouchMode="true">

Questo LinearLayoutcon il tuo Edittext.


0
  1. Cambia lo stato attivo in un'altra vista (es: qualsiasi visualizzazione di testo o Linearlayout nell'XML) utilizzando

    android:focusableInTouchMode="true"
    android:focusable="true"
  2. imposta addTextChangedListener su edittext in Activity.

  3. e poi su aftertextchange di Edittext put edittext.clearFocus();

Ciò abiliterà il cursore quando la tastiera è aperta e disabiliterà quando la tastiera è chiusa.


0

In kotlin your_edittext.isCursorVisible = false


Per favore, formatta il markup. Puoi farlo rientrando il codice di 4 spazi.
Danon,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.