Làm cách nào để chỉnh sửa TextText không thể chỉnh sửa thông qua XML trong Android?


300

Bất cứ ai có thể cho tôi biết làm thế nào để làm cho EditTextkhông thể chỉnh sửa thông qua XML? Tôi cố gắng thiết lập android:editableđể false, nhưng

  1. nó bị phản đối; và
  2. nó không hoạt động.

6
Nếu không thể chỉnh sửa, tại sao bạn cần Chỉnh sửa? Không sử dụng một TextView thông thường là đủ? Và hàm setEditable () có bị phản đối không?
kiki

4
Đối với tôi điều này có ý nghĩa để cho phép dán sao chép tiêu chuẩn cho nội dung. Với TextView, điều đó là không thể (ít nhất là không phải là hành vi mặc định)
Ixx

1
Sửa chữa: Đó là một ý tưởng tồi. Trên một số trường hợp nhất định, chế độ xem trở nên có thể chỉnh sửa hoặc các tùy chọn dán sao chép không hiển thị nữa. Sẽ tìm cách tiếp cận khác.
Ixx

11
Trong trường hợp của tôi, tôi muốn tạm thời vô hiệu hóa EditText trong khi một tập hợp các hoạt động thực hiện, và sau đó kích hoạt lại khi hoạt động kết thúc.
Joe Plante

1
Câu hỏi này là về một mối quan tâm chính đáng. Để duy trì EditTextphong cách và cho phép cuộn, sử dụng UI.setReadOnly(myEditText, true)từ thư viện này . Có một vài thuộc tính phải được đặt, bạn có thể kiểm tra mã nguồn .
caw

Câu trả lời:


399

Sử dụng mã đơn giản này:

textView.setKeyListener(null);

Nó hoạt động.

Chỉnh sửa: Để thêm KeyListenersau, hãy làm theo

1: đặt trình nghe khóa thành thẻ của textView

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

2: lấy trình nghe khóa từ thẻ và đặt lại textView

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

30
@AnkitAwasthi textView.setTag (textView.getKeyListener ()); đặt lại sau này với textView.setKeyListener ((KeyListener) textView.getTag ());
Thomas Dignan

@TomDignan cách tuyệt vời dễ dàng đến đó! Tôi có một câu hỏi. Điều này theo bất kỳ cách nào có thể thay đổi các giá trị mặc định mà KeyListener cần, như setFocusable()bởi vì tài liệu nói rằng việc triển khai mặc định có thể bị thay đổi nếu thay đổi.
Andy

afaik không, thẻ nên có sẵn để bạn sử dụng
Thomas Dignan

Hey đề nghị của bạn đã giúp tôi..thanx
user1387035

38
Câu hỏi là về việc thiết lập nó thông qua XML , tại sao điều này được đánh dấu là giải pháp?
Denys Vitali

398

Thêm phần này vào tập tin EditText xml của bạn:

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

Nó sẽ làm hiệu ứng tương tự như android:editable="false". Làm việc cho tôi, hy vọng nó cũng sẽ làm việc cho bạn.


3
ghi chú.setKeyListener (null); ghi chú.setClickable (sai); ghi chú.setCthonVisible (false); ghi chú.setF Focusable (false); ghi chú.setF FocusableInTouchMode (false);
Jack Franzen

3
Nếu bạn muốn làm điều đó trong XML ... điều gì sẽ là sự khác biệt giữa nó và TextView ???
Chris Sim

11
Sự khác biệt là Nó có thể được sử dụng vớiTextInputLayout
ahmadalibaloch

2
Điều này nên được đánh dấu là giải pháp, vì nó là một giải pháp XML thuần túy theo yêu cầu trong câu hỏi.
zgc7009

2
Điều này không được chấp nhận (tháng 10 năm 2018)
Sebastian Paduano

54

Hãy để Edittext của bạn được

EditText editText;

editText.setKeyListener(null);

sẽ hoạt động nhưng nó chỉ không nghe phím.

Người dùng có thể thấy một con trỏ trên edittext.

Bạn co thể thử editText.setEnabled(false);

Điều đó có nghĩa là người dùng không thể nhìn thấy con trỏ. Nói một cách đơn giản nó sẽ trở thành TextView.


3
Điều này đúng vì EditText là một lớp con của TextView. Tuy nhiên, vui lòng sử dụng editText làm biến thay vì textView.
Joe Plante

@JoePlante Thay đổi tên biến nhờ bình luận mang tính xây dựng.
Mahendran

màu xám này ra EditText
stephen

Màu xám EditText chỉ ra rằng nó bị vô hiệu hóa và người dùng không thể chỉnh sửa nó.
Mahendran

Giải quyết màu sắc cũng như sẽ ngăn chặn sự xuất hiện màu xám. XML: Dùng thử android: textColor = "@ color / Black" android: enable = "false"
Rượu vang đỏ

32

Như đã đề cập trong các câu trả lời khác, bạn có thể thực hiện setEnabled(false) nhưng vì bạn đang hỏi cách đặt nó qua XML, đây là cách thực hiện.

Thêm thuộc tính sau vào EditText:

android:enabled="false"

4
câu trả lời chính xác cho câu hỏi OP.
SMR

nhưng phương pháp này không được chấp nhận
Lalit kumar

2
@Lalitkumar enabledkhông được phản đối. editableLà.
InsanityOnABun

7
bằng cách kích hoạt, chúng tôi không thể truy cập trình nghe nhấp chuột là tốt. Vì vậy, đối với tôi nó không phải là câu trả lời.
Naveed Ahmad

đây là văn bản ẩn :(
Chego

24

vô hiệu hóa từ XML (một dòng):

 android:focusable="false"

kích hoạt lại từ Java, nếu cần (cũng là một dòng):

editText.setFocusableInTouchMode(true);

Câu trả lời tốt. Bằng cách này, bạn vẫn có thể đặt giá trị editText bằng editText.setText ("văn bản của bạn"). Nhưng người dùng không thể chỉnh sửa nó.
Prakash

17

Họ đã phản đối "không thể chỉnh sửa" nhưng không cung cấp một hoạt động tương ứng trong inputType.

Nhân tiện, inputType = "none" có ảnh hưởng gì không? Sử dụng nó hay không không tạo ra bất kỳ sự khác biệt nào như tôi thấy.

Ví dụ, chỉnh sửa mặc định được gọi là một dòng. Nhưng bạn phải chọn một kiểu đầu vào cho nó là một dòng đơn. Và nếu bạn chọn "không", nó vẫn là multiline.


1
Nó không tạo sự khác biệt trên tất cả các thiết bị, nhưng nó nên , theo các tài liệu: developer.android.com/reference/android/widget/...
caw

12
Một ví dụ tuyệt vời về mớ hỗn độn của Google
Yar

14

Sự kết hợp này làm việc cho tôi:

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

13

Như bạn đã đề cập Android: có thể chỉnh sửa bị phản đối. android: inputType = "none" nên được sử dụng thay thế nhưng nó không hoạt động do lỗi ( https://code.google.com.vn/p/android/issues/detail?id=2854 )

Nhưng bạn có thể đạt được điều tương tự bằng cách sử dụng tập trung.

Qua XML:

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

Từ mã:

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

Với sự cho phép của google, lỗi sẽ rơi vào hai kịch bản khác nhau: 1.) Nó sẽ được sửa nhưng sau 6 năm 2.) Nó sẽ không bao giờ được sửa, họ sẽ chỉ phát triển phiên bản Android mới.
Cuộc chiến tranh

12

nếu bạn muốn nhấp vào nó, nhưng không muốn chỉnh sửa nó, hãy thử:

        android:focusable="false"

8

Chỉ cần sử dụng android:enabled="false". Điều này cũng sẽ xuất hiện để EditTextlàm cho nó trông không thể chỉnh sửa.


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

và sử dụng như sau:

txtDate.setKeyListener(null);

7

Nếu bạn muốn làm điều đó trong mã java, chỉ cần sử dụng dòng này để vô hiệu hóa nó:

editText.setEnabled(false);

Và điều này để kích hoạt nó:

editText.setEnabled(true);

5

Tôi đã cố gắng làm:

textView.setInputType( InputType.TYPE_NULL );

Điều này sẽ làm việc, nhưng đối với tôi thì không.

Tôi đã hoàn thành với mã này:

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

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

mà hoạt động hoàn hảo.


4

Khi tôi muốn một hoạt động không tập trung vào EditText và cũng không hiển thị bàn phím khi nhấp vào, đây là hoạt động phù hợp với tôi.

Thêm thuộc tính vào bố cục chính

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

và sau đó là trường EditText

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

Đây là một ví dụ:

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

Ngoài @mahe madi, bạn cũng có thể thử điều này

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

Phương pháp này sẽ ẩn con trỏ, mất tiêu điểm và quan trọng hơn là đặt màu văn bản thành màu đen hoạt động như TextView.

Và để hoàn nguyên Quay lại chỉnh sửa, chỉ cần làm điều này để có được tất cả các thuộc tính của EditText.

editText.setEnabled(true);

Hy vọng nó giúp :)


3

Bạn có thể sử dụng android:editable="false"nhưng tôi thực sự khuyên bạn nên sử dụng setEnabled(false)vì nó cung cấp manh mối trực quan cho người dùng rằng điều khiển không thể được chỉnh sửa. Các cue trực quan tương tự được sử dụng bởi tất cả các vật dụng bị vô hiệu hóa và tính nhất quán là tốt.


3
android:focusable="false"

android:clickable="false"

android:longClickable="false"

Thuộc tính "longClickable" sẽ vô hiệu hóa các hành động nhấn dài gây ra các tùy chọn "Dán" và "Chọn tất cả" để hiển thị dưới dạng một chú giải công cụ.


2

Tôi đã thử như sau:

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

  }

});

nhưng vấn đề là nếu văn bản chỉnh sửa là văn bản đầu tiên trong biểu mẫu thì nó sẽ lấy tiêu điểm và mã pickCode () khởi chạy một hoạt động mới được gọi ngay lập tức. Vì vậy, tôi đã sửa đổi mã như sau và nó có vẻ hoạt động khá tốt (ngoại trừ tôi không thể đặt trọng tâm vào chỉnh sửa văn bản nhưng tôi không cần phải làm vậy):

itemCodeEditText.setFocusable(false);

this.itemCodeEditText.setOnClickListener(new OnClickListener() {

  @Override
  public void onClick(View v) {

    pickItem();

  }

});

Trân trọng,

Bình luận chào mừng,

John Goche


1
Có vẻ hoạt động tốt, nhưng không dễ sử dụng TextView giống như EditText (bằng cách sử dụng: style = "@ android: style / Widget.EditText")?
nhà phát triển Android

2

Tôi sử dụng EditText.setFocusable(false)và đặt lại đúng nếu tôi muốn chỉnh sửa.



2

Cách này đã làm công việc cho tôi, tôi có thể chọn và sao chép vào clipboard, nhưng tôi không thể sửa đổi hoặc dán.

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

1

android: có thể chỉnh sửa bị phản đối vì vậy sử dụng inputType thay thế.

   <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" khác nhiều so với android: có thể chỉnh sửa, hãy tự mình thử!
Denys Vitali

Nếu bạn sẽ làm cho EditText của bạn không thể chỉnh sửa được, tôi có thể đề xuất sử dụng tiện ích TextView thay vì EditText, vì việc sử dụng EditText có vẻ như vô nghĩa trong trường hợp đó.
M-Razavi

Đề xuất của bạn không áp dụng cho Chỉnh sửa với PopupWindow, hãy xem hình ảnh này để hiểu rõ hơn vấn đề. Trong ví dụ này, tôi muốn có giao diện của EditText nhưng tôi phải "khóa nó" để cho phép người dùng thay đổi giá trị chỉ bằng cửa sổ bật lên. Kiểm tra vấn đề này để xem thêm động lực. Đó là một vấn đề xảy ra từ năm 2009.
Denys Vitali

1

Tôi đã phải đối mặt với cùng một vấn đề nhưng sau khi quan sát tôi thấy rằng android:editable="false"nó chỉ hoạt động khi inputtype ( android:inputType="ANY_VALUE") không được đưa ra trong Edittext.

Xóa inputType khỏi EditText và sử dụng editable = false, nó hoạt động tốt.


0

Tôi giải quyết điều này bằng một hộp thoại.

    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

Câu trả lời ngắn: Tôi đã sử dụng android:focusable="false"và nó đã làm việc. Bấm nghe cũng đang làm việc.



-10

Hãy thử mã này. Nó hoạt động trong dự án của tôi, vì vậy nó sẽ hoạt động trong dự án của bạn.

android:editable="false"

2
Tôi có thể xác nhận rằng điều này không hoạt động và không nên sử dụng phương pháp khấu hao nào nữa.
Adorjan Princz

1
android: có thể chỉnh sửa thực sự là giải pháp tốt nhất nếu bạn muốn trường có thể nhấp nhưng không thể chỉnh sửa, tức là mở hộp thoại sau khi nhấp vào nó.
Yar

không phải vì nó hoạt động trong dự án của bạn mà nó sẽ thuộc về chúng ta. Suy nghĩ rất kém.
Cuộc chiến tranh
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.