Bagaimana membuat EditText tidak dapat diedit melalui XML di Android?

300

Adakah yang bisa memberi tahu saya cara membuat yang EditTexttidak dapat diedit melalui XML? Saya mencoba setting android:editableuntuk false, tetapi

  1. itu sudah ditinggalkan; dan
  2. tidak berhasil.
Fran Fitzpatrick
sumber
6
Jika tidak dapat diedit, mengapa Anda memerlukan EditText? Tidak akan menggunakan TextView biasa cukup? Dan apakah fungsi setEditable () tidak digunakan lagi?
kiki
4
Bagi saya ini masuk akal untuk mengaktifkan copy paste standar untuk konten. Dengan TextView itu tidak mungkin (setidaknya bukan perilaku default)
Ixx
1
Koreksi: Itu ide yang buruk. Pada keadaan tertentu tampilan menjadi dapat diedit, atau opsi tempel salin tidak muncul lagi. Akan mencari pendekatan lain.
Ixx
11
Dalam kasus saya, saya ingin menonaktifkan sementara EditText sementara serangkaian operasi melakukan, dan kemudian mengaktifkannya kembali ketika operasi selesai.
Joe Plante
1
Pertanyaan ini tentang keprihatinan yang sah. Untuk mempertahankan EditTextgaya dan mengizinkan pengguliran, gunakan UI.setReadOnly(myEditText, true)dari perpustakaan ini . Ada beberapa properti yang harus diset, yang dapat Anda periksa di kode sumber .
gak

Jawaban:

399

Gunakan kode sederhana ini:

textView.setKeyListener(null);

Berhasil.

Sunting: Untuk menambahkan KeyListenernanti, lakukan yang berikut

1: atur pendengar kunci ke tag textView

textView.setTag(textView.getKeyListener());
textView.setKeyListener(null);

2: dapatkan pendengar kunci dari tag dan atur kembali ke textView

textView.setKeyListener((KeyListener) textView.getTag());
Kristiono Setyadi
sumber
30
@AnkitAwasthi textView.setTag (textView.getKeyListener ()); atur kembali nanti dengan textView.setKeyListener ((KeyListener) textView.getTag ());
Thomas Dignan
@ TomDignan cara yang bagus dengan mudah! Saya punya satu pertanyaan. Apakah ini dengan cara apa pun mengubah nilai default yang diperlukan oleh KeyListener, seperti setFocusable()karena doc mengatakan bahwa implementasi default dapat diubah jika diubah.
Andy
afaik tidak, tag harus tersedia untuk Anda gunakan
Thomas Dignan
Hai saran Anda membantu saya .. terima kasih
user1387035
38
Pertanyaannya adalah tentang pengaturannya melalui XML , mengapa ini ditandai sebagai solusi?
Denys Vitali
398

Tambahkan ini ke file xml EditText Anda:

<EditText ...
        android:clickable="false" 
        android:cursorVisible="false" 
        android:focusable="false" 
        android:focusableInTouchMode="false">
</EditText>

Ini akan melakukan efek yang sama dengan android:editable="false". Berfungsi untuk saya, semoga juga berhasil untuk Anda.

GalDude33
sumber
3
notes.setKeyListener (null); notes.setClickable (false); notes.setCursorVisible (false); notes.setFocusable (false); notes.setFocusableInTouchMode (false);
Jack Franzen
3
Jika Anda ingin melakukannya dalam XML ... apa perbedaannya dengan TextView ???
Chris Sim
11
Perbedaannya adalah Ini dapat digunakan denganTextInputLayout
ahmadalibaloch
2
Ini harus ditandai sebagai solusi, karena ini adalah solusi XML murni seperti yang diminta dalam pertanyaan.
zgc7009
2
Ini sudah tidak berlaku lagi (Oktober 2018)
Sebastian Paduano
54

Biarkan Edittext Anda menjadi

EditText editText;

editText.setKeyListener(null);

akan bekerja tetapi tidak mendengarkan kunci.

Pengguna dapat melihat kursor pada edittext.

Anda dapat mencoba editText.setEnabled(false);

Itu berarti pengguna tidak dapat melihat kursor. Untuk sekadar mengatakan itu akan menjadi TextView.

Mahendran
sumber
3
Itu benar karena EditText adalah subkelas dari TextView. Namun, harap gunakan editText sebagai variabel alih-alih textView.
Joe Plante
@JoePlante Mengubah nama variabel, terima kasih atas komentar yang membangun.
Mahendran
ini memberi warna pada EditText
stephen
EditText Berabu menunjukkan bahwa itu dinonaktifkan dan pengguna tidak dapat mengeditnya.
Mahendran
Menenangkan warna juga akan mencegah penampilan yang abu-abu. XML: Coba android: textColor = "@ color / Black" android: enabled = "false"
Red wine
32

Seperti disebutkan dalam jawaban lain, Anda bisa melakukan setEnabled(false) tetapi karena Anda bertanya bagaimana cara mengaturnya melalui XML, berikut adalah cara melakukannya.

Tambahkan atribut berikut ke EditText:

android:enabled="false"
vida
sumber
4
jawaban yang tepat untuk pertanyaan OP.
SMR
tetapi metode ini tidak digunakan lagi
Lalit kumar
2
@Lalitkumar enabledtidak ditinggalkan. editableadalah.
InsanityOnABun
7
dengan mengaktifkan, kami juga tidak dapat mengakses pendengar klik. jadi bagi saya itu bukan jawabannya.
Naveed Ahmad
ini menyembunyikan teks :(
Chego
24

nonaktifkan dari XML (satu baris):

 android:focusable="false"

aktifkan kembali dari Jawa, jika perlu (juga satu baris):

editText.setFocusableInTouchMode(true);
kouretinho
sumber
Jawaban yang bagus. Dengan cara ini Anda masih dapat mengatur nilai editText menggunakan editText.setText ("teks Anda"). Tetapi pengguna tidak dapat mengeditnya.
Prakash
17

Mereka membuat "dapat diedit" usang tetapi tidak memberikan yang sesuai bekerja di inputType.

Omong-omong, apakah inputType = "tidak ada" berpengaruh? Menggunakannya atau tidak, tidak ada bedanya sejauh yang saya lihat.

Misalnya, editText default dikatakan sebagai satu baris. Tetapi Anda harus memilih jenis input untuk menjadi satu baris. Dan jika Anda memilih "tidak ada", itu masih multiline.

Timuçin
sumber
1
Itu tidak membuat perbedaan pada semua perangkat, tetapi seharusnya , menurut dokumen: developer.android.com/reference/android/widget/…
caw
12
Contoh indah kekacauan Google
Yar
14

Kombinasi ini bekerja untuk saya:

<EditText ... >
    android:longClickable="false"
    android:cursorVisible="false"
    android:focusableInTouchMode="false"
</EditText>
Massimo Fazzolari
sumber
13

Seperti yang Anda sebutkan android: dapat diedit sudah usang. android: inputType = "none" harus digunakan sebagai gantinya tetapi tidak berfungsi karena bug ( https://code.google.com/p/android/issues/detail?id=2854 )

Tetapi Anda dapat mencapai hal yang sama dengan menggunakan fokus.

Melalui XML:

<EditText ...
        android:focusable="false" 
</EditText>

Dari kode:

((EditText) findViewById(R.id.LoginNameEditText)).setFocusable(false);
Adorjan Princz
sumber
Atas perkenan google, bug akan jatuh ke dalam dua skenario yang berbeda: 1.) Akan diperbaiki tetapi setelah 6 tahun 2.) Tidak akan pernah diperbaiki, mereka hanya akan mengembangkan versi Android yang baru.
Neon Warge
12

jika Anda ingin mengkliknya, tetapi tidak ingin mengeditnya, coba:

        android:focusable="false"
Kai Wang
sumber
8

Gunakan saja android:enabled="false". Ini juga akan memberikan tampilan EditTextyang membuatnya tidak dapat diedit.

Shahid Sarwar
sumber
7
<EditText
    android:id="@+id/txtDate"
    android:layout_width="140dp"
    android:layout_height="wrap_content"
    android:layout_marginLeft="5dp"
    android:layout_marginRight="10dp"
    android:layout_marginTop="2dp"
    android:clickable="false"
    android:cursorVisible="false"
    android:gravity="center" />

dan gunakan yang berikut:

txtDate.setKeyListener(null);
askimp
sumber
7

Jika Anda ingin melakukannya dalam kode java cukup gunakan baris ini untuk menonaktifkannya:

editText.setEnabled(false);

Dan ini untuk mengaktifkannya:

editText.setEnabled(true);
pengguna3185897
sumber
5

Saya mencoba melakukan:

textView.setInputType( InputType.TYPE_NULL );

yang seharusnya berhasil, tetapi bagi saya tidak.

Saya selesai dengan kode ini:

textView.setKeyListener(new NumberKeyListener() {
    public int getInputType() {
        return InputType.TYPE_NULL;
    }

    protected char[] getAcceptedChars() {
        return new char[] {};
    }
});

yang bekerja dengan sempurna.

saric
sumber
4

Ketika saya ingin suatu kegiatan tidak fokus pada EditText dan juga tidak menampilkan papan ketik saat diklik, inilah yang berhasil bagi saya.

Menambahkan atribut ke tata letak utama

android:descendantFocusability="beforeDescendants"
android:focusableInTouchMode="true"

dan kemudian bidang EditText

android:focusable="false"
android:focusableInTouchMode="false"

Berikut ini sebuah contoh:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_home"
    android:background="@drawable/bg_landing"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="0dp"
    android:paddingLeft="0dp"
    android:paddingRight="0dp"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:descendantFocusability="beforeDescendants"
    android:focusableInTouchMode="true"
    tools:context="com.woppi.woppi.samplelapp.HomeActivity">

    <EditText
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@null"
        android:inputType="textPersonName"
        android:ems="10"
        android:id="@+id/fromEditText"
        android:layout_weight="1"
        android:hint="@string/placeholder_choose_language"
        android:textColor="@android:color/white"
        android:textColorHint="@android:color/darker_gray"
        android:focusable="false"
        android:focusableInTouchMode="false"
        android:onClick="onSelectFromLanguage" />

</RelativeLayout>
Woppi
sumber
3

Selain @mahe madi, Anda dapat mencoba ini juga

editText.setEnabled(false);
editor.setTextColor(Color.BLACK);

Metode ini akan menyembunyikan kursor, kehilangan fokus dan yang lebih penting mengatur warna teks menjadi hitam seperti TextView.

Dan untuk mengembalikan Kembali ke editText cukup lakukan ini untuk mendapatkan semua properti EditText.

editText.setEnabled(true);

Semoga Membantu :)

Pengguna super
sumber
3

Anda dapat menggunakan android:editable="false"tetapi saya benar-benar akan menyarankan Anda untuk menggunakan setEnabled(false)karena memberikan petunjuk visual kepada pengguna bahwa kontrol tidak dapat diedit. Isyarat visual yang sama digunakan oleh semua widget yang dinonaktifkan dan konsistensi yang baik.

jclafuente
sumber
3
android:focusable="false"

android:clickable="false"

android:longClickable="false"

Atribut "longClickable" menonaktifkan aksi tekan lama yang menyebabkan opsi "Tempel" dan atau "Pilih Semua" muncul sebagai tooltip.

Radhey
sumber
2

Saya sudah mencoba yang berikut ini:

codeEditText.setInputType(InputType.TYPE_NULL);

this.codeEditText.setOnFocusChangeListener(new OnFocusChangeListener() {

  @Override
  public void onFocusChange(View v, boolean hasFocus) {

    if (hasFocus) {

      pickCode();

    }

  }

});
this.codeEditText.setOnClickListener(new OnClickListener() {

  @Override
  public void onClick(View v) {

    pickCode();

  }

});

tetapi masalahnya adalah jika teks edit adalah yang pertama dalam bentuk maka itu mendapatkan fokus dan kode pickCode () yang meluncurkan aktivitas baru disebut langsung. Jadi saya memodifikasi kode sebagai berikut dan sepertinya berfungsi dengan baik (kecuali saya tidak dapat mengatur fokus pada edit teks tetapi saya tidak perlu):

itemCodeEditText.setFocusable(false);

this.itemCodeEditText.setOnClickListener(new OnClickListener() {

  @Override
  public void onClick(View v) {

    pickItem();

  }

});

Salam Hormat,

Komentar diterima,

John Goche

johngoche9999
sumber
1
Tampaknya berfungsi dengan baik, tetapi bukankah lebih mudah menggunakan TextView yang terlihat seperti EditText (using: style = "@ android: style / Widget.EditText")?
pengembang android
2

Saya menggunakan EditText.setFocusable(false)dan mengatur true lagi jika saya ingin mengedit.

nobjta_9x_tq
sumber
2

Coba ini :

android:inputType="none"
Rutvik
sumber
2

Dengan cara ini melakukan pekerjaan untuk saya, saya dapat memilih dan menyalin ke clipboard, tetapi saya tidak dapat memodifikasi atau menempel.

android:enable="true"
android:textIsSelectable="true"
android:inputType="none"
Leo
sumber
1

android: dapat diedit sudah usang jadi gunakan inputType sebagai gantinya.

   <EditText
        android:id="@+id/editText_x"
        android:layout_width="0dp"
        android:layout_height="fill_parent"
        android:layout_weight="70"
        android:inputType="none"
        android:hint="@string/enter_x" />
M-Razavi
sumber
android: inputType = "tidak ada" jauh berbeda dari android: dapat diedit, coba sendiri!
Denys Vitali
Jika Anda akan membuat EditText Anda tidak dapat diedit, bolehkah saya menyarankan menggunakan widget TextView daripada EditText, karena menggunakan EditText sepertinya tidak ada gunanya dalam hal ini.
M-Razavi
Saran Anda tidak berlaku untuk EditText dengan PopupWindow, lihat gambar ini untuk lebih memahami masalahnya. Dalam contoh ini saya ingin tampilan EditText tapi saya harus "menguncinya" agar pengguna dapat mengubah nilai hanya dengan jendela sembul. Periksa masalah ini untuk melihat lebih banyak motivasi. Ini masalah yang ada sejak 2009.
Denys Vitali
1

Saya telah menghadapi masalah yang sama tetapi setelah pengamatan saya menemukan bahwa android:editable="false"hanya berfungsi ketika inputtype ( android:inputType="ANY_VALUE") tidak diberikan dalam Edittext.

Hapus inputType dari EditText dan gunakan editable = false, itu berfungsi dengan baik.

shubomb
sumber
0

Saya menyelesaikan ini dengan dialog.

    AlertDialog dialog;
    EditText _editID;
    TextView _txtID;

 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_principal);
        _txtID = (TextView) findViewById(R.id._txtID);
        dialog = new AlertDialog.Builder(this).create();
        _editID = new EditText(this);
        _editID.setInputType(InputType.TYPE_NUMBER_FLAG_SIGNED);
        dialog.setTitle("Numero do Registro:");
        dialog.setView(_editID);
        dialog.setButton(DialogInterface.BUTTON_POSITIVE, "IR", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                _txtID.setText(_editID.getText());
                toId(Integer.parseInt((_editID.getText().toString())));
            }
        });
        dialog.setButton(DialogInterface.BUTTON_NEGATIVE, "CANCELAR", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                dialog.dismiss();
            }
        });

        _txtID.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                _txtID.setText("_editID.getText()");
                //_editID.setText("");
                dialog.show();

            }
        });
João Scheleder Neto
sumber
0

Jawaban singkat: Saya menggunakan android:focusable="false"dan berhasil. Mendengarkan klik juga berfungsi sekarang.

Anbuselvan Rocky
sumber
-1

Mencoba

.setInputType(InputType.TYPE_NULL);
benmakp benmakn
sumber
-10

Coba kode ini. Ini bekerja di proyek saya, jadi itu akan bekerja di proyek Anda.

android:editable="false"
pengguna2309848
sumber
2
Saya dapat mengonfirmasi bahwa ini tidak berfungsi dan terlebih lagi menggunakan metode penyusutan tidak disarankan.
Adorjan Princz
1
android: dapat diedit sebenarnya adalah solusi terbaik jika Anda ingin bidang dapat diklik tetapi tidak dapat diedit, yaitu untuk membuka dialog setelah mengkliknya.
Yar
bukan karena itu bekerja pada proyek Anda, itu akan menjadi milik kita. Pemikiran yang sangat buruk.
Neon Warge