Desativar o cursor piscando EditText

180

Alguém sabe como desativar o cursor piscando em uma EditTextexibição?

Kevin Parker
fonte

Respostas:

355

Você pode usar o atributo xml android:cursorVisible="false"ou a função java setCursorVisible(false).

Vic
fonte
13
Impressionante, este juntamente com OnClickListener que o torna visível dá o comportamento correto :)
Warpzit
1
@cerin existe uma maneira de ocultar o marcador azul para que eu possa desativar a colagem, mas mantenha o cursor visível para que o usuário veja onde ele está no campo?
limlim
9
É possível desativar apenas o piscar, e não o cursor?
desenvolvedor android
35

Solução perfeita que vai além do objetivo

Objetivo: desative o cursor piscante quando EditTextnão estiver em foco e ative o cursor piscante quando EditTextestiver em foco. Abaixo também abre o teclado quando você EditTextclica e o oculta quando você pressiona o botão concluído.

1) Defina no seu xml sob o seu EditText:

android:cursorVisible="false"

2) Defina onClickListener:

iEditText.setOnClickListener(editTextClickListener);

OnClickListener editTextClickListener = new OnClickListener() 

{

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

    }
};

3) onCreatecaptura o evento quando concluído e pressiona usando OnEditorActionListenerpara EditText, e então 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;
            }
        });
coolcool1994
fonte
6
KeyEvent.KEYCODE_ENTER não funcionará para todos os teclados. Você precisará mencionar especificamente android: imeOptions = "actionDone" no layout e manipular o EditorInfo.IME_ACTION_DONE também.
PsyGik
Grande resposta apenas deve substituir no clique com no toque, porque algum foco tempo editar ganho de texto sem no clique portanto, neste caso o cursor não vai ser mostrado
Antwan
10

Você pode usar o código a seguir para ativar e desativar o cursor de edição de texto programaticamente.

Para ativar o cursor

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

Para desativar o cursor

    editText.setCursorVisible(false);

Usando o XML ativar o cursor de desativação

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

Para tornar edit_text Selecionável para (copiar / recortar / colar / selecionar / selecionar tudo)

   editText.setTextIsSelectable(true);

Para se concentrar no modo de toque, escreva as seguintes linhas em XML

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

programaticamente

  editText.requestFocusFromTouch();

Para limpar o foco no modo de toque

  editText.clearFocus()
Sagar
fonte
editText.clearFocus () é o que eu estava procurando. Obrigado!! +1
iUser 26/06
3

O problema com a configuração da visibilidade do cursor como true e false pode ser um problema, pois ele remove o cursor até que você o defina novamente e ao mesmo tempo o campo seja editável, o que não é uma boa experiência do usuário.

então ao invés de usar

setCursorVisible(false)

apenas faça assim

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

O código acima remove o foco que, por sua vez, remove o cursor. E habilita-o novamente para que você possa tocá-lo novamente e poder editá-lo. Assim como a experiência normal do usuário.

Vikas Kumar
fonte
2

No meu caso, eu queria ativar / desativar o cursor quando a edição estiver focada.

Na sua atividade:

@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);
}
MontiRabbit
fonte
Certeza de que você deseja edit.setCursorVisible(!isKeyboardOpen);estar edit.setCursorVisible(isKeyboardOpen);para que o cursor fique visível quando o teclado estiver presente.
Daniel Tempestade
2

simples adicione esta linha ao seu layout pai

<?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>
Null Pointer Exception
fonte
1

Se você deseja ignorar a Edittextpartir do início da atividade, android:focusablee android:focusableInTouchModeirá ajudá-lo 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">

Isso LinearLayoutcom o seu Edittext.

Sajid khan
fonte
0
  1. Altere o foco para outra visualização (por exemplo: qualquer visualização de texto ou layout linear no XML) usando

    android:focusableInTouchMode="true"
    android:focusable="true"
  2. defina addTextChangedListener como edittext em Activity.

  3. e depois em aftertextchanged de Edittext put edittext.clearFocus();

Isso ativará o cursor quando o teclado estiver aberto e será desativado quando o teclado estiver fechado.

Bhavani PK
fonte
0

No kotlin, your_edittext.isCursorVisible = false

Rohit Rohit
fonte
Por favor, formate a marcação. Você pode fazer isso recuando o código por 4 espaços.
Danon