วิธีทำให้ EditText ไม่สามารถแก้ไขได้ผ่าน XML ใน Android


300

ทุกคนสามารถบอกวิธีทำให้EditTextไม่สามารถแก้ไขได้ผ่านทาง XML หรือไม่ ฉันพยายามตั้งค่าandroid:editableให้falseแต่

  1. มันเลิกใช้แล้ว; และ
  2. มันไม่ทำงาน

6
หากไม่สามารถแก้ไขได้ทำไมคุณต้องใช้ EditText TextView ธรรมดาจะไม่เพียงพอหรือไม่ และฟังก์ชัน setEditable () เลิกใช้แล้วหรือไม่
kiki

4
สำหรับฉันมันเหมาะสมแล้วที่จะเปิดใช้งาน copy copy มาตรฐานสำหรับเนื้อหา ด้วย TextView มันเป็นไปไม่ได้ (อย่างน้อยก็ไม่ใช่พฤติกรรมเริ่มต้น)
Ixx

1
การแก้ไข: มันเป็นความคิดที่ไม่ดี ในบางสถานการณ์มุมมองจะสามารถแก้ไขได้หรือตัวเลือกวางสำเนาจะไม่ปรากฏอีกต่อไป จะมองหาวิธีการอื่น
Ixx

11
ในกรณีของฉันฉันต้องการปิดการใช้งาน EditText ชั่วคราวในขณะที่ชุดของการดำเนินการทำงานแล้วเปิดใช้งานอีกครั้งเมื่อการดำเนินการเสร็จสิ้น
Joe Plante

1
คำถามนี้เกี่ยวกับข้อกังวลที่ชอบด้วยกฎหมาย เพื่อรักษาEditTextสไตล์และการอนุญาตให้เลื่อนใช้UI.setReadOnly(myEditText, true)จากไลบรารีนี้ มีคุณสมบัติไม่กี่คนที่จะต้องมีการตั้งค่าที่คุณสามารถตรวจสอบอยู่ในรหัสที่มา
caw

คำตอบ:


399

ใช้รหัสง่ายๆนี้:

textView.setKeyListener(null);

มันได้ผล.

แก้ไข: หากต้องการเพิ่มในKeyListenerภายหลังให้ทำดังต่อไปนี้

1: ตั้งค่าผู้ฟังคีย์เป็นแท็กของ textView

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

2: รับฟังคีย์จากแท็กและตั้งค่ากลับเป็น textView

textView.setKeyListener((KeyListener) textView.getTag());

30
@AnkitAwasthi textView.setTag (textView.getKeyListener ()); ตั้งค่ากลับมาในภายหลังด้วย textView.setKeyListener ((KeyListener) textView.getTag ());
โทมัส Dignan

@ TomDignan วิธีที่ยอดเยี่ยมได้อย่างง่ายดายว่า! ฉันมีคำถามหนึ่งข้อ สิ่งนี้ทำในทางใดทางหนึ่งเปลี่ยนแปลงค่าเริ่มต้นที่จำเป็นโดย KeyListener เช่นsetFocusable()เพราะหมอบอกว่าการใช้งานเริ่มต้นอาจมีการเปลี่ยนแปลงหากมีการเปลี่ยนแปลง
Andy

afaik no, แท็กควรจะมีให้คุณใช้
Thomas Dignan

เฮ้ข้อเสนอแนะของคุณช่วยฉัน .. ขอบคุณ
user1387035

38
คำถามเกี่ยวกับการตั้งค่าผ่านXMLทำไมจึงถูกทำเครื่องหมายเป็นวิธีแก้ปัญหา
Denys Vitali

398

เพิ่มลงในไฟล์ EditText xml ของคุณ:

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

android:editable="false"มันจะทำผลเช่นเดียวกับ ทำงานให้ฉันหวังว่ามันจะได้ผลกับคุณเช่นกัน


3
notes.setKeyListener (null); notes.setClickable (false); notes.setCursorVisible (false); notes.setFocusable (false); notes.setFocusableInTouchMode (false);
Jack Franzen

3
ถ้าคุณต้องการที่จะทำใน XML ... สิ่งที่จะเป็นความแตกต่างระหว่างมันและ TextView ???
Chris Sim

11
ความแตกต่างคือมันสามารถใช้กับTextInputLayout
ahmadalibaloch

2
ควรทำเครื่องหมายเป็นโซลูชันเนื่องจากเป็นโซลูชัน XML ที่บริสุทธิ์ตามที่ร้องขอในคำถาม
zgc7009

2
นี่เลิกใช้แล้ว (ตุลาคม 2018)
Sebastian Paduano

54

ให้ Edittext ของคุณเป็น

EditText editText;

editText.setKeyListener(null);

จะทำงาน แต่ก็ไม่ได้ฟังกุญแจ

ผู้ใช้สามารถเห็นเคอร์เซอร์บน edittext

คุณสามารถลอง editText.setEnabled(false);

นั่นหมายความว่าผู้ใช้ไม่เห็นเคอร์เซอร์ TextViewเพียงแค่บอกว่ามันจะกลายเป็น


3
มันถูกต้องเนื่องจาก EditText เป็น subclass ของ TextView อย่างไรก็ตามโปรดใช้ editText เป็นตัวแปรแทน textView
Joe Plante

@JoePlante เปลี่ยนชื่อตัวแปรขอบคุณสำหรับความคิดเห็นที่สร้างสรรค์
Mahendran

นี่จะทำให้ EditText
stephen

EditText สีเทาระบุว่ามันถูกปิดใช้งานและผู้ใช้ไม่สามารถแก้ไขได้
Mahendran

การตั้งค่าสีรวมทั้งป้องกันการปรากฏเป็นสีเทา XML: ลองใช้ android: textColor = "@ color / Black" android: enabled = "false"
ไวน์แดง

32

ดังที่กล่าวไว้ในคำตอบอื่น ๆ คุณสามารถทำได้setEnabled(false) แต่เมื่อคุณถามวิธีตั้งค่าผ่าน XML นี่คือวิธีการทำ

เพิ่มแอตทริบิวต์ต่อไปนี้ของคุณEditText:

android:enabled="false"

4
คำตอบที่แน่นอนสำหรับคำถาม OPs
SMR

แต่วิธีนี้เลิกใช้แล้ว
Lalit kumar

2
@Lalitkumar enabledไม่ได้คัดค้าน editableคือ.
InsanityOnABun

7
โดยเปิดใช้งานเราไม่สามารถเข้าถึงฟังการคลิกได้เช่นกัน ดังนั้นสำหรับฉันมันไม่ใช่คำตอบ
อาเหม็ด Naveed

นี่คือซ่อนข้อความ :(
Chego

24

ปิดการใช้งานจาก XML (หนึ่งบรรทัด):

 android:focusable="false"

เปิดใช้งานอีกครั้งจาก Java ถ้าต้องการ (ยังเป็นหนึ่งบรรทัด):

editText.setFocusableInTouchMode(true);

คำตอบที่ดี. วิธีนี้คุณยังสามารถตั้งค่า editText โดยใช้ editText.setText ("your text") แต่ผู้ใช้ไม่สามารถแก้ไขได้
Prakash

17

พวกเขาทำให้ "แก้ไขได้" เลิกใช้แล้ว แต่ไม่มีการทำงานที่สอดคล้องกันใน inputType

ยังไงก็ตาม inputType = "none" มีผลกระทบอะไรบ้าง? ใช้งานหรือไม่สร้างความแตกต่างเท่าที่ฉันเห็น

ตัวอย่างเช่น editText เริ่มต้นถูกกล่าวว่าเป็นบรรทัดเดียว แต่คุณต้องเลือก inputType เพื่อให้เป็นบรรทัดเดียว และถ้าคุณเลือก "ไม่มี" ก็ยังคงเป็นแบบหลายบรรทัด


1
มันไม่ได้สร้างความแตกต่างให้กับทุกอุปกรณ์ แต่ควรเป็นไปตามเอกสาร: developer.android.com/reference/android/widget/…
caw

12
ตัวอย่างที่สวยงามของระเบียบ Google
Yar


13

ดังที่คุณกล่าวถึง android: สามารถแก้ไขได้เลิกใช้แล้ว android: inputType = "none" ควรใช้แทน แต่ไม่สามารถใช้งานได้เนื่องจากข้อบกพร่อง ( https://code.google.com/p/android/issues/detail?id=2854 )

แต่คุณสามารถบรรลุสิ่งเดียวกันโดยใช้ focusable

ผ่าน XML:

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

จากรหัส:

((EditText) findViewById(R.id.LoginNameEditText)).setFocusable(false);

ด้วยความเห็นใจของ google ข้อผิดพลาดจะตกอยู่ในสองสถานการณ์ที่แตกต่างกัน: 1. ) มันจะได้รับการแก้ไข แต่หลังจาก 6 ปี 2. ) มันจะไม่ได้รับการแก้ไขพวกเขาจะพัฒนา Android เวอร์ชันใหม่
Neon Warge


8

android:enabled="false"ใช้เพียงแค่ สิ่งนี้จะทำให้มีลักษณะEditTextที่จะทำให้ดูไม่สามารถแก้ไขได้


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

และใช้ดังต่อไปนี้:

txtDate.setKeyListener(null);

7

หากคุณต้องการที่จะทำมันในรหัส java เพียงแค่ใช้บรรทัดนี้เพื่อปิดการใช้งาน:

editText.setEnabled(false);

และนี่เพื่อเปิดใช้งาน:

editText.setEnabled(true);

5

ฉันพยายามทำ:

textView.setInputType( InputType.TYPE_NULL );

ซึ่งควรทำงานได้ แต่สำหรับฉันมันไม่ได้

ฉันจบด้วยรหัสนี้:

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

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

ซึ่งทำงานได้อย่างสมบูรณ์แบบ


4

เมื่อฉันต้องการให้กิจกรรมไม่เน้น EditText และไม่แสดงแป้นพิมพ์เมื่อคลิกนี่คือสิ่งที่ใช้ได้กับฉัน

การเพิ่มคุณสมบัติให้กับเค้าโครงหลัก

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

จากนั้นฟิลด์ EditText

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

นี่คือตัวอย่าง:

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

นอกจาก @mahe madi คุณสามารถลองได้เช่นกัน

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

วิธีนี้จะซ่อนเคอร์เซอร์เสียโฟกัสและตั้งค่าสีของข้อความเป็นสีดำเหมือน TextView

และการย้อนกลับไปที่ editText ทำได้ง่ายๆเพื่อรับคุณสมบัติทั้งหมดของ EditText

editText.setEnabled(true);

หวังว่าจะช่วย :)


3

คุณสามารถใช้android:editable="false"แต่ฉันอยากจะแนะนำให้คุณใช้จริงๆsetEnabled(false)เพราะมันให้เงื่อนงำภาพแก่ผู้ใช้ว่าไม่สามารถแก้ไขการควบคุมได้ คิวภาพที่เหมือนกันถูกใช้โดยวิดเจ็ตที่ถูกปิดใช้งานทั้งหมดและความสอดคล้องเป็นสิ่งที่ดี


3
android:focusable="false"

android:clickable="false"

android:longClickable="false"

แอตทริบิวต์ "longClickable" ปิดใช้งานการดำเนินการกดแบบยาวที่ทำให้ตัวเลือก "วาง" และหรือ "เลือกทั้งหมด" เพื่อแสดงเป็นคำแนะนำเครื่องมือ


2

ฉันได้ลองทำสิ่งต่อไปนี้แล้ว:

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

  }

});

แต่ปัญหาคือถ้าข้อความแก้ไขเป็นครั้งแรกในรูปแบบนั้นจะได้รับการมุ่งเน้นและรหัส pickCode () ซึ่งเปิดตัวกิจกรรมใหม่ที่เรียกว่าทันที ดังนั้นฉันจึงแก้ไขโค้ดดังต่อไปนี้และดูเหมือนว่าจะทำงานได้ค่อนข้างดี (ยกเว้นฉันไม่สามารถตั้งค่าโฟกัสที่การแก้ไขข้อความ แต่ฉันไม่ต้องการ):

itemCodeEditText.setFocusable(false);

this.itemCodeEditText.setOnClickListener(new OnClickListener() {

  @Override
  public void onClick(View v) {

    pickItem();

  }

});

ขอแสดงความนับถืออย่างสูง,

ความเห็นยินดีต้อนรับ

John Goche


1
ดูเหมือนว่าจะทำงานได้ดี แต่ใช้ TextView ง่ายกว่าหรือไม่ซึ่งดูเหมือน EditText (using: style = "@ android: style / Widget.EditText")?
นักพัฒนา android



2

วิธีนี้ทำงานให้ฉันฉันสามารถเลือกและคัดลอกไปยังคลิปบอร์ด แต่ฉันไม่สามารถแก้ไขหรือวางได้

android:enable="true"
android:textIsSelectable="true"
android:inputType="none"

1

android: ไม่สามารถแก้ไขได้ดังนั้นให้ใช้inputTypeแทน

   <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 = "none" แตกต่างจาก android: สามารถแก้ไขได้ลองด้วยตัวคุณเอง!
Denys Vitali

หากคุณกำลังจะทำให้ EditText ของคุณไม่สามารถแก้ไขได้ฉันขอแนะนำให้ใช้วิดเจ็ต TextView แทน EditText เนื่องจากการใช้ EditText ดูเหมือนจะไม่มีประโยชน์ในกรณีนั้น
M-Razavi

ข้อเสนอแนะของคุณไม่ได้ใช้สำหรับ EditText ด้วย PopupWindow โปรดดูภาพนี้เพื่อทำความเข้าใจปัญหาให้ดีขึ้น ในตัวอย่างนี้ฉันต้องการดู EditText แต่ฉันต้อง "ล็อค" เพื่อให้ผู้ใช้เปลี่ยนค่าโดย popupwindow ตรวจสอบปัญหานี้เพื่อดูแรงจูงใจเพิ่มเติม มันเป็นปัญหาที่เกิดขึ้นตั้งแต่ปี 2009
Denys Vitali

1

ผมได้ประสบปัญหาเดียวกัน แต่หลังจากการสังเกตพบว่าandroid:editable="false"เป็นเพียงการทำงานเมื่อ inputtype ( android:inputType="ANY_VALUE") จะไม่ได้รับใน EditText

ลบ inputType จาก EditText และใช้ editable = false มันทำงานได้ดี


0

ฉันแก้ไขปัญหานี้ด้วยกล่องโต้ตอบ

    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

คำตอบสั้น ๆ : ฉันใช้android:focusable="false"และใช้งานได้ คลิกฟังยังทำงานอยู่ในขณะนี้



-10

ลองรหัสนี้ มันทำงานในโครงการของฉันดังนั้นมันจะทำงานในโครงการของคุณ

android:editable="false"

2
ฉันสามารถยืนยันได้ว่าวิธีนี้ใช้ไม่ได้และไม่แนะนำให้ใช้วิธีที่คิดค่าเสื่อมราคามากกว่านี้
Adorjan Princz

1
android: แก้ไขได้จริง ๆ แล้วเป็นทางออกที่ดีที่สุดถ้าคุณต้องการให้ฟิลด์นั้นสามารถคลิกได้ แต่ไม่สามารถแก้ไขได้เช่นเปิดกล่องโต้ตอบหลังจากคลิกที่มัน
Yar

ไม่ใช่เพราะมันทำงานในโครงการของคุณ คิดไม่ดีมาก
Neon Warge
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.