Menonaktifkan EditText di Android


195

Dalam aplikasi saya, saya memiliki EditText bahwa pengguna hanya memiliki akses Baca bukan akses Tulis.

Dalam kode saya atur android:enabled="false".

Meskipun latar belakang EditText berubah menjadi gelap, ketika saya mengkliknya keyboard muncul dan saya dapat mengubah teks.

Apa yang harus saya atur untuk menonaktifkan EditText?


2
Dimungkinkan untuk mempertahankan gaya tampilan dan perilaku pengguliran. Untuk menonaktifkan EditTextdan menjaga properti ini, gunakan saja UI.setReadOnly(myEditText, true)dari perpustakaan ini . Jika Anda ingin mereplikasi perilaku ini tanpa pustaka, periksa kode sumber untuk metode kecil ini.
gak

Jawaban:


245

Saya percaya yang benar adalah mengatur android:editable="false".

Dan jika Anda bertanya-tanya mengapa tautan saya mengarah ke atribut TextView, Anda jawabannya adalah karena EditTextmewarisi dari TextView:

EditText adalah lapisan tipis di atas TextView yang mengonfigurasikan dirinya untuk dapat diedit.

Pembaruan:
Seperti disebutkan dalam komentar di bawah, editablesudah usang ( karena API level 3 ). Anda seharusnya menggunakan inputType(dengan nilai none).


terima kasih Nailuj, sayangnya itu tidak berhasil. Setelah menambahkan keyboard saran Anda muncul dan ada kemampuan untuk mengubah teks.
Hesam

17
android: dapat diedit sudah usang. android: inputType = "none" harus digunakan sebagai gantinya tetapi mengandung bug dan tidak berfungsi. Alangkah baiknya jika kita semua membintangi masalah ini di sini: code.google.com/p/android/issues/detail?id=2854
Viktor Brešan

85
editText.setEnabled(false); editText.setInputType(InputType.TYPE_NULL);
Asymptote

28
android:editable="false" android:focusable="false"bekerja sangat baik untuk saya (lupakan tentang usang, saya pikir android: dapat diedit tidak ada hubungannya dengan android: inputType)
Muhammad Babar

8
Untuk semuanya, untuk siapa android: inputType = "tidak ada" tidak berfungsi, coba: android: inputType = "tidak ada" dengan android: focusable = "false"
Surendra Kumar

161

gunakan EditText.setFocusable(false) untuk menonaktifkan pengeditan
EditText.setFocusableInTouchMode(true)untuk mengaktifkan pengeditan;


Ini berfungsi, tetapi ini bukan praktik yang baik karena tampilan sepertinya dapat diedit tetapi tidak bisa. Bekerja dengan baik untuk saya karena Tampilan saya memiliki latar belakang khusus, jadi +1.
kaneda

4
@kaneda. Saya sebenarnya lebih suka ini. Saya tidak ingin kotak saya berwarna abu-abu. :)
Doomsknight

1
Di Android 4.4, opsi ini mempertahankan warna teks asli. Menggunakan editText.setEnabled(false);akan mengubah warna teks menjadi abu-abu. Namun, pemintal tidak mengubah warna teks saat menggunakan setEnabled, menjadikannya pengalaman yang tidak konsisten.
tbraun

mengapa tidak setFocusable(true)? lihat tautan ini untuk perbedaan antara setFocusable()dan setFocusableInTouchMode(): stackoverflow.com/questions/23799064/…
kenju

Ini sangat sesuai dengan kebutuhan saya. Saya membuat tampilan khusus majemuk dengan EditText di dalamnya. Saya mengalami masalah dalam membuat tampilan khusus milik saya untuk hanya menerima klik tetapi tidak dapat diedit karena ini meluncurkan dialog pemilih tanggal. Solusi ini berfungsi karena tidak menonaktifkan onClickListeners
Neon Warge

64

Anda dapat mencoba metode berikut:

 private void disableEditText(EditText editText) {
    editText.setFocusable(false);
    editText.setEnabled(false);
    editText.setCursorVisible(false);
    editText.setKeyListener(null);
    editText.setBackgroundColor(Color.TRANSPARENT); 
 }

Diedit EditText:

Diedit EditText

Teks Edit yang Dinonaktifkan:

Nonaktif EditTeks

Ini bekerja untuk saya dan saya harap ini membantu Anda.


1
Ini terlihat seperti TextView. Sangat menakjubkan. Ini yang saya cari.
Yunus

4
Jika seseorang memiliki masalah yang sama dengan mengaktifkan kembali - Anda harus menelepon editText.setFocusableInTouchMode(true)alih-alih editText.setFocusable(true).
Dart Dega

61

Gunakan ini untuk menonaktifkan input pengguna

android:focusable="false"

android: editable = "false" Metode ini sudah usang.


1
Ini harus menjadi jawaban yang diterima. Mengatur tipe input ke 'tidak ada' seperti yang disarankan dalam jawaban lain tidak (selalu) berfungsi. Pengaturan yang diaktifkan untuk 'false' mencegah pengeditan tetapi juga meredupkan teks yang mungkin atau mungkin tidak diinginkan.
jerry

36

Untuk menonaktifkan edit EditText, saya pikir kita bisa menggunakan focusable ATAU enable tetapi

  1. Menggunakan android:enabled=...ataueditText.setEnabled(...)

    Ini juga mengubah warna teks EditTextmenjadi abu-abu.
    Ketika diklik itu tidak berpengaruh

  2. Menggunakan android:focusable=...atau editText.setFocusable(false)-editText.setFocusableInTouchMode(true)

    Itu tidak mengubah warna teks EditText
    Ketika diklik itu menyoroti EditTextgaris bawah selama sekitar beberapa milidetik

Keluaran

masukkan deskripsi gambar di sini


19

Seperti android:editable="false"yang didepartasi. Anda dapat menggunakan InputType TYPE_NULL pada EditText

gunakan seperti ini:

editText.setInputType(InputType.TYPE_NULL);

1
Menyukai jawaban ini karena tidak menonaktifkan onClickListener di lapangan.
Harsh Ganatra

apa yang harus dilakukan jika inputType adalah kata sandi? TYPE_NULL membuat kata sandi terlihat.
ilyamuromets

17

Seperti yang android:editable="false"sudah usang dixml

Gunakan android:enabled="false"itu sederhana. Mengapa menggunakan lebih banyak kode?

Jika ingin, java classAnda juga dapat menggunakan ini secara terprogram

 editText.setEnabled(false);

gunakan android: enabled = "true" untuk mengaktifkan
android_jain

8

Secara sederhana:

editText.setEnabled(false);

1
Apa bedanya dengan jawaban sebelumnya (jadi pertanyaan)?
Onik

setFocusable (false) juga memungkinkan Anda mengatur OnClickListener.
Oded Breiner

5

Setel properti di bawah ini di kelas:

editText.setFocusable(false);
editText.setEnabled(false);

Ini akan bekerja dengan lancar sesuai kebutuhan Anda.


hanya enabledcukup
makan

5

Untuk menonaktifkan fungsionalitas EditText, cukup gunakan:

EditText.setInputType(InputType.TYPE_NULL);

jika Anda ingin mengaktifkannya, maka Anda dapat menggunakan:

EditText.setInputType(InputType.TYPE_CLASS_TEXT);

apa yang harus dilakukan jika inputType adalah kata sandi? TYPE_NULL membuat kata sandi terlihat.
ilyamuromets

4

jika Anda menggunakan android:editable="false", eclipse akan mengingatkan Anda pesan ini "android: diedit sudah usang: Gunakan inputType sebagai gantinya".

Jadi, saya gunakan android:focusable="false"sebagai gantinya, itu bekerja dengan baik untuk saya.


4
android:editable="false"

sekarang tidak digunakan lagi dan digunakan

 YourEditText.setInputType(InputType.TYPE_NULL);

apa yang harus dilakukan jika inputType adalah kata sandi? TYPE_NULL membuat kata sandi terlihat.
ilyamuromets

@ilyamuromets Jawaban ini mungkin membantu stackoverflow.com/a/16720520/7704650 dengan TYPE_TEXT_VARIATION_PASSWORDIkuti ini untuk lebih lanjut developer.android.com/reference/android/text/InputType
emkarachchi

Saya ingin menonaktifkan input di EditText saat keyboard lunak dibuka dan pengguna mencoba memasukkan teks. InputType.TYPE_NULL berfungsi sangat baik dengan isFocusable dan isFocusableInTouchMode dalam nilai false. Tetapi jika inputType dari field input adalah textPassword maka InputType.TYPE_NULL membuat nilai kata sandi terlihat. Jika saya mengatur InputType.TYPE_NULL | InputType.TYPE_TEXT_VARIATION_PASSWORD maka kata sandi juga menjadi terlihat dan pengguna dapat memasukkan teks.
ilyamuromets


3

Nonaktifkan = FOKUS + KLIK + CURSOR

Menonaktifkan fokus, klik, dan visibilitas kursor berguna untuk saya.

Berikut adalah kode dalam XML

<EditText
    android:id="@+id/name"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:focusable="false"
    android:cursorVisible="false"
    android:clickable="false"
    />

2

Ini akan membuat edittext Anda dinonaktifkan .

editText.setEnabled(false);

Dan dengan menggunakan ini

editText.setInputType(InputType.TYPE_NULL);

Hanya akan membuat Edittext Anda tidak menunjukkan papan tombol Anda, tetapi jika terhubung ke keyboard fisik, itu akan membuat Anda mengetik.


apa yang harus dilakukan jika inputType adalah kata sandi? TYPE_NULL membuat kata sandi terlihat.
ilyamuromets

2

Saya menggunakan Pustaka Desain Bahan google yang baru dirilis. Dalam kasus saya, ini berfungsi ketika saya menggunakan android: focusable = "false" dan android: cursorVisible = "false"

<com.google.android.material.textfield.TextInputLayout
                    android:id="@+id/to_time_input_layout"
                    app:endIconMode="custom"
                    app:endIconDrawable="@drawable/ic_clock"
                    app:endIconContentDescription="ToTime"
                    app:endIconTint="@color/colorAccent"
                    style="@style/OutlinedEditTextStyle"
                    android:hint="To Time">

                    <com.google.android.material.textfield.TextInputEditText
                        android:id="@+id/to_time_edit_text"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:focusable="false"
                        android:cursorVisible="false" />

</com.google.android.material.textfield.TextInputLayout>

1

Dalam kasus saya, saya perlu saya EditTextuntuk menggulir teks jika tidak. dari garis melebihi maxLinesketika dinonaktifkan. Implementasi ini bekerja dengan baik untuk saya.

private void setIsChatEditTextEditable(boolean value)
{
    if(value)
    {
        mEdittext.setCursorVisible(true);
        mEdittext.setSelection(chat_edittext.length());
       // use new EditText(getApplicationContext()).getKeyListener()) if required below
        mEdittext.setKeyListener(new AppCompatEditText(getApplicationContext()).getKeyListener());  
    }
    else
    {
        mEdittext.setCursorVisible(false);
        mEdittext.setKeyListener(null);
    }
}

1

Coba yang ini, bekerja dengan baik untuk saya:

public class CustomEdittext extends EditText {

Boolean mIsTextEditor=true;
public CustomEdittext(Context context, AttributeSet attrs) {
    super(context, attrs);
    // TODO Auto-generated constructor stub
}

@Override
public boolean onCheckIsTextEditor() {
    // TODO Auto-generated method stub
    return mIsTextEditor;
}


@Override
public boolean onTouchEvent(MotionEvent event) {
    // TODO Auto-generated method stub
    mIsTextEditor=false;
    Boolean mOnTouchEvent=super.onTouchEvent(event);
    mIsTextEditor=true;     
    return mOnTouchEvent;
} }

Catatan: Anda harus menambahkan this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN); aktivitas Anda atau yang lain keyboardakan muncul saat pertama kali.


1

Seperti beberapa jawaban menyebutkannya, jika Anda menonaktifkan editText, ia menjadi abu-abu dan jika Anda mengatur false fokus, kursor ditampilkan.

Jika Anda ingin melakukannya hanya dengan xml, ini berhasil

       <YourFloatLabel
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

            <EditText
                android:id="@+id/view_ads_search_select"
                android:layout_width="match_parent"
                android:layout_height="wrap_content" />

            <FrameLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:focusable="true"
                android:clickable="true"/>  
       </YourFloatLabel>

Saya cukup menambahkan FrameLayout yang muncul di atas editText dan mengaturnya fokus dan dapat diklik sehingga editText tidak dapat diklik.


0

Ini bekerja untuk saya:

android: focusable = "false"


2
Apa bedanya dengan yang diposting Sampath Kumar 4 tahun lalu?
gobrewers14

0

Dari komentar @ Asymptote pada jawaban yang diterima, gunakan:

myEditText.setEnabled(false);
myEditText.setInputType(InputType.TYPE_NULL);

... dan Bob adalah pamanmu.


0

Hari ini saya masih menggunakan editable="false", tetapi juga dengan focusable="false".

Saya pikir kasus kita perlu membuat EditText tidak dapat diedit, adalah karena kita ingin mempertahankan gaya EditText-nya (dengan garis bawahi itu, dengan petunjuk, dll), tetapi ia menerima input lain alih-alih teks. Misalnya daftar dropdown.

Dalam hal penggunaan seperti itu, kita perlu memiliki yang EditTextdapat diklik (sehingga enabled="false"tidak cocok). Pengaturan focusable="false"melakukan trik ini, namun, saya masih bisa menahan EditText dan menempelkan teks saya sendiri ke dalamnya dari clipboard . Bergantung pada kode dan penanganan Anda, ini bahkan dapat membuat aplikasi Anda mogok.

Jadi saya juga menggunakan editable="false"dan sekarang semuanya bagus, kecuali peringatan.


0

Anda dapat menggunakan android:focusable="false"tetapi juga harus menonaktifkan kursor jika fungsi copy / paste masih akan berfungsi.

jadi, gunakan

android:focusable="false"
android:cursorVisible="false"

0

Ada beberapa cara bagaimana mencapai beberapa tingkat cacat.

  • editText.setShowSoftInputOnFocus(false); dan editText.setFocusable

mencegah EditTextkeyboard tidak menampilkan - menulis dalam beberapa teks. Tetapi kursor masih terlihat dan pengguna dapat menempel di beberapa teks.

  • editText.setCursorVisible(false)

menyembunyikan kursor. Tidak yakin mengapa Anda ingin melakukan itu. Pengguna dapat memasukkan teks & rekat.

  • editText.setKeyListener(null)

Saya menemukan cara ini paling nyaman. Tidak ada cara bagaimana pengguna dapat memasukkan teks, tetapi widget masih berfungsi OnClickListenerjika Anda ingin memicu tindakan ketika pengguna menyentuhnya

  • editText.setEnabled(false);

sepenuhnya menonaktifkan EditText. Secara harfiah 'hanya-baca', pengguna tidak dapat memasukkan teks apa pun di dalamnya dan (misalnya) OnClickListener tidak bekerja dengannya.

Dokumentasi TextEdit


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.