Deaktivieren Sie den blinkenden EditText-Cursor

180

Weiß jemand, wie man den blinkenden Cursor in einer EditTextAnsicht deaktiviert ?

Kevin Parker
quelle

Antworten:

354

Sie können entweder das XML-Attribut android:cursorVisible="false"oder die Java-Funktion verwenden setCursorVisible(false).

Vic
quelle
13
Genial, dies zusammen mit onclicklistener, der es sichtbar macht, ergibt das richtige Verhalten :)
Warpzit
1
@cerin gibt es eine Möglichkeit, die blaue Markierung auszublenden, damit ich das Einfügen deaktivieren kann, aber den Cursor sichtbar halten kann, damit der Benutzer sieht, wo er sich im Feld befindet?
Limlim
9
Ist es möglich, nur das Blinken selbst und nicht den Cursor zu deaktivieren?
Android-Entwickler
35

Perfekte Lösung, die weiter zum Ziel führt

Ziel: Deaktivieren Sie den blinkenden Cursor, wenn er EditTextnicht scharfgestellt ist, und aktivieren Sie den blinkenden Cursor, wenn er scharfgestellt EditTextist. Unten öffnet sich auch die Tastatur, wennEditText klicken, und sie wird ausgeblendet, wenn Sie auf der Tastatur auf Fertig drücken.

1) Stellen Sie in Ihrer XML unter Ihre EditText:

android:cursorVisible="false"

2) OnClickListener einstellen:

iEditText.setOnClickListener(editTextClickListener);

OnClickListener editTextClickListener = new OnClickListener() 

{

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

    }
};

3) onCreateErfassen Sie dann das Ereignis, wenn Sie fertig sind , und drücken OnEditorActionListenerSie EditTextdann auf 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
quelle
6
KeyEvent.KEYCODE_ENTER funktioniert nicht für alle Tastaturen. Sie müssen android: imeOptions = "actionDone" im Layout ausdrücklich erwähnen und dann auch EditorInfo.IME_ACTION_DONE behandeln.
PsyGik
Eine gute Antwort sollte nur beim Klicken durch Berühren ersetzt werden, da einige Zeit beim Bearbeiten von Text der Fokus ohne Klicken erreicht wird. In diesem Fall wird der Cursor nicht angezeigt
Antwan
10

Sie können den folgenden Code zum programmgesteuerten Aktivieren und Deaktivieren des Bearbeitungs-Textcursors verwenden.

Cursor aktivieren

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

Cursor deaktivieren

    editText.setCursorVisible(false);

Mit XML aktivieren Sie den Cursor deaktivieren

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

So bearbeiten Sie edit_text wählbar auf (kopieren / ausschneiden / einfügen / auswählen / alle auswählen)

   editText.setTextIsSelectable(true);

Um sich auf den Touch-Modus zu konzentrieren, schreiben Sie die folgenden Zeilen in XML

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

programmatisch

  editText.requestFocusFromTouch();

So löschen Sie den Fokus auf den Touch-Modus

  editText.clearFocus()
Sagar
quelle
editText.clearFocus () ist das, wonach ich gesucht habe. Vielen Dank!! +1
iUser
3

Das Problem beim Setzen der Cursorsichtbarkeit auf true und false kann ein Problem sein, da der Cursor entfernt wird, bis Sie ihn erneut setzen und gleichzeitig das Feld bearbeitet werden kann, was keine gute Benutzererfahrung darstellt.

also anstatt zu benutzen

setCursorVisible(false)

mach es einfach so

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

Der obige Code entfernt den Fokus, wodurch wiederum der Cursor entfernt wird. Und aktiviert es wieder, so dass Sie es wieder berühren und bearbeiten können. Genau wie bei einer normalen Benutzererfahrung.

vikas kumar
quelle
2

In meinem Fall wollte ich den Cursor aktivieren / deaktivieren, wenn die Bearbeitung fokussiert ist.

In Ihrer Aktivität:

@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
quelle
Ziemlich sicher, dass Sie so sein möchten edit.setCursorVisible(!isKeyboardOpen);, edit.setCursorVisible(isKeyboardOpen);dass der Cursor sichtbar ist, wenn die Tastatur vorhanden ist.
Daniel Storm
2

Fügen Sie diese Zeile einfach in Ihr übergeordnetes Layout ein

<?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>
Nullzeiger-Ausnahme
quelle
1

Wenn Sie das Edittextvon Beginn der Aktivität an ignorieren möchten android:focusableund android:focusableInTouchModeIhnen helfen werden, 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">

Das LinearLayoutmit deinem Edittext.

Sajid Khan
quelle
0
  1. Ändern Sie den Fokus mithilfe von auf eine andere Ansicht (z. B. eine beliebige Textansicht oder ein lineares Layout im XML)

    android:focusableInTouchMode="true"
    android:focusable="true"
  2. Setzen Sie addTextChangedListener in Activity auf edittext.

  3. und dann nach dem Textwechsel von Edittext setzen edittext.clearFocus();

Dadurch wird der Cursor bei geöffneter Tastatur aktiviert und bei geschlossener Tastatur deaktiviert.

Bhavani PK
quelle
0

In kotlin your_edittext.isCursorVisible = false

Rohit Rohit
quelle
Bitte formatieren Sie das Markup. Sie können dies tun, indem Sie den Code um 4 Leerzeichen einrücken.
Danon