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?

Hesam
sumber
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).

Julian
sumber
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;

Sean Android
sumber
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.

Maksym Kalin
sumber
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.

Sampath Kumar
sumber
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

Phan Van Linh
sumber
19

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

gunakan seperti ini:

editText.setInputType(InputType.TYPE_NULL);
Bhargav Thanki
sumber
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);
android_jain
sumber
gunakan android: enabled = "true" untuk mengaktifkan
android_jain
8

Secara sederhana:

editText.setEnabled(false);
Oded Breiner
sumber
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.

Pangkat
sumber
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);
hypergogeta
sumber
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.

Wangzhengyi
sumber
4
android:editable="false"

sekarang tidak digunakan lagi dan digunakan

 YourEditText.setInputType(InputType.TYPE_NULL);
emkarachchi
sumber
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

Gunakan TextViewsebagai gantinya.

cx0der
sumber
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"
    />
Rohit Singh
sumber
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.

Mark Joshua Fajardo
sumber
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>
Aminul Haque Aome
sumber
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);
    }
}
Rishabh876
sumber
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.

Favas Kv
sumber
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.

Vodet
sumber
0

Ini bekerja untuk saya:

android: focusable = "false"

Annie
sumber
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.

Tom Howard
sumber
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.

Sira Lam
sumber
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"
M. Usman
sumber
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

Biru tua
sumber
0

Set ini dalam kode XML Anda, Ini berfungsi.

android: focusableInTouchMode = "false"

Sujeet Kumar Gupta
sumber