Nonaktifkan kursor EditText yang berkedip

180

Apakah ada yang tahu cara menonaktifkan kursor yang berkedip dalam EditTexttampilan?

Kevin Parker
sumber

Jawaban:

355

Anda dapat menggunakan atribut xml android:cursorVisible="false"atau fungsi java setCursorVisible(false).

Vic
sumber
13
Luar biasa, ini bersama dengan onclicklistener yang membuatnya terlihat memberikan perilaku yang benar :)
Warpzit
1
@cerin apakah ada cara untuk menyembunyikan penanda biru sehingga saya dapat menonaktifkan tempel, tetapi biarkan kursor tetap terlihat sehingga pengguna akan melihat di mana dia berada di lapangan?
limlim
9
Apakah mungkin untuk menonaktifkan hanya kedipan itu sendiri, dan bukan kursor?
pengembang android
35

Solusi Sempurna yang melangkah lebih jauh ke tujuan

Sasaran: Menonaktifkan curser yang berkedip ketika EditTexttidak fokus, dan mengaktifkan curser yang berkedip ketika EditTextsedang dalam fokus. Di bawah ini juga buka keyboard saatEditText diklik, dan menyembunyikannya saat Anda menekan selesai di keyboard.

1) Ditetapkan dalam xml Anda di bawah EditText:

android:cursorVisible="false"

2) Set onClickListener:

iEditText.setOnClickListener(editTextClickListener);

OnClickListener editTextClickListener = new OnClickListener() 

{

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

    }
};

3) lalu onCreate, tangkap acara setelah selesai ditekan menggunakan OnEditorActionListeneruntuk Anda EditText, lalu 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
sumber
6
KeyEvent.KEYCODE_ENTER tidak akan berfungsi untuk semua keyboard. Anda harus menyebutkan secara khusus android: imeOptions = "actionDone" di tata letak dan kemudian menangani juga EditorInfo.IME_ACTION_DONE.
PsyGik
Jawaban yang bagus hanya harus mengganti klik dengan sentuhan karena beberapa waktu mengedit fokus memperoleh teks tanpa di klik sehingga dalam hal ini kursor tidak akan ditampilkan
Antwan
10

Anda dapat menggunakan kode berikut untuk mengaktifkan dan menonaktifkan kursor teks edit secara terprogram.

Untuk Mengaktifkan kursor

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

Untuk Menonaktifkan kursor

    editText.setCursorVisible(false);

Menggunakan XML memungkinkan nonaktifkan kursor

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

Untuk membuat edit_text Dapat dipilih untuk (salin / potong / tempel / pilih / pilih semua)

   editText.setTextIsSelectable(true);

Untuk fokus pada mode sentuh, tulis baris berikut dalam XML

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

secara terprogram

  editText.requestFocusFromTouch();

Untuk menghapus fokus pada mode sentuh

  editText.clearFocus()
Sagar
sumber
editText.clearFocus () adalah apa yang saya cari. Terima kasih!! +1
iUser
3

Masalah dengan pengaturan visibilitas kursor ke true dan false mungkin menjadi masalah karena menghapus kursor hingga Anda mengaturnya lagi dan pada saat yang sama bidang dapat diedit yang bukan pengalaman pengguna yang baik.

jadi alih-alih menggunakan

setCursorVisible(false)

lakukan saja seperti ini

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

Kode di atas menghilangkan fokus yang pada gilirannya menghilangkan kursor. Dan mengaktifkannya lagi sehingga Anda dapat menyentuhnya lagi dan dapat mengeditnya. Sama seperti pengalaman pengguna normal.

vikas kumar
sumber
2

Dalam kasus saya, saya ingin mengaktifkan / menonaktifkan kursor ketika pengeditan difokuskan.

Dalam Aktivitas Anda:

@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
sumber
Cukup yakin Anda ingin edit.setCursorVisible(!isKeyboardOpen);menjadi edit.setCursorVisible(isKeyboardOpen);sehingga kursor terlihat ketika keyboard hadir.
Daniel Storm
2

sederhana tambahkan baris ini ke tata letak induk Anda

<?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>
Pengecualian Null Pointer
sumber
1

Jika Anda ingin mengabaikan Edittextdari awal kegiatan, android:focusabledan android:focusableInTouchModeakan membantu Anda insya Allah.

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

Ini LinearLayoutdengan Anda Edittext.

Sajid khan
sumber
0
  1. Ubah fokus ke tampilan lain (mis: Tayangan teks apa pun atau Linearlayout dalam XML) menggunakan

    android:focusableInTouchMode="true"
    android:focusable="true"
  2. atur addTextChangedListener ke edittext di Activity.

  3. dan kemudian setelah perubahan Edittext menempatkan edittext.clearFocus();

Ini akan memungkinkan kursor ketika keyboard terbuka dan menonaktifkan ketika keyboard ditutup.

Bhavani PK
sumber
0

Di kotlin your_edittext.isCursorVisible = false

Rohit Rohit
sumber
Tolong, format markup. Anda dapat melakukannya dengan memasukkan kode sebanyak 4 spasi.
Danon