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.

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());

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.


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.


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"

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);

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.


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>

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);

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"

8

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


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);

7

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

editText.setEnabled(false);

Dan ini untuk mengaktifkannya:

editText.setEnabled(true);

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.


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>

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 :)


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.


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.


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


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.



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"

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

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.


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();

            }
        });

0

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



-10

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

android:editable="false"

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