Vô hiệu hóa EditText trong Android


195

Trong ứng dụng của mình, tôi có một EditText mà người dùng chỉ có quyền truy cập Đọc chứ không truy cập Ghi.

Trong mã tôi đặt android:enabled="false".

Mặc dù nền của EditText đã thay đổi thành màu tối, nhưng khi tôi nhấp vào nó, bàn phím bật lên và tôi có thể thay đổi văn bản.

Tôi nên cài đặt gì để tắt EditText?


2
Có thể duy trì cả kiểu dáng của chế độ xem và hành vi cuộn. Để vô hiệu hóa EditTexttrong khi giữ các thuộc tính này, chỉ cần sử dụng UI.setReadOnly(myEditText, true)từ thư viện này . Nếu bạn muốn sao chép hành vi này mà không có thư viện, hãy kiểm tra mã nguồn cho phương thức nhỏ này.
caw

Câu trả lời:


245

Tôi tin rằng chính xác sẽ được thiết lập android:editable="false".

Và nếu bạn tự hỏi tại sao liên kết của tôi chỉ đến các thuộc tính của TextView, thì câu trả lời là vì EditTextkế thừa từ TextView:

EditText là một veneer mỏng trên TextView tự cấu hình để có thể chỉnh sửa.

Cập nhật:
Như đã đề cập trong các bình luận bên dưới, editablekhông được dùng nữa ( vì API cấp 3 ). Thay vào đó bạn nên sử dụng inputType(với giá trị none).


cảm ơn Nailuj, tiếc là nó không hoạt động. Sau khi thêm bàn phím gợi ý của bạn bật lên và có khả năng thay đổi văn bản.
Hesam

17
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ó chứa lỗi và nó không hoạt động. Sẽ thật tuyệt nếu tất cả chúng ta đều đánh dấu vấn đề ở đây: code.google.com/p/android/issues/detail?id=2854
Viktor Brešan

85
editText.setEnabled(false); editText.setInputType(InputType.TYPE_NULL);
tiệm cận

28
android:editable="false" android:focusable="false"hoạt động rất tốt đối với tôi (quên về việc không dùng nữa, tôi nghĩ android: có thể chỉnh sửa không liên quan gì đến android: inputType)
Muhammad Babar

8
Đối với tất cả những người mà android: inputType = "none" không hoạt động, hãy thử: android: inputType = "none" với android: Focusable = "false"
Surendra Kumar

161

sử dụng EditText.setFocusable(false) để vô hiệu hóa chỉnh sửa
EditText.setFocusableInTouchMode(true)để cho phép chỉnh sửa;


Nó hoạt động, nhưng đó không phải là một thực tiễn tốt vì chế độ xem có vẻ như có thể chỉnh sửa nhưng không thể. Hoạt động tốt với tôi vì Chế độ xem của tôi có nền tùy chỉnh, nên +1.
kaneda

4
@kaneda. Tôi thực sự thích điều này. Tôi không muốn hộp của mình bị mờ đi. :)
Doomsknight

1
Trong Android 4.4, tùy chọn này giữ màu văn bản gốc. Sử dụng editText.setEnabled(false);sẽ thay đổi màu văn bản thành màu xám. Tuy nhiên, spinners không thay đổi màu văn bản khi sử dụng setEnabled, làm cho nó trở thành một trải nghiệm không nhất quán.
tbraun

tại sao không setFocusable(true)? xem liên kết này để biết sự khác biệt giữa setFocusable()setFocusableInTouchMode(): stackoverflow.com/questions/23799064/ cấp
kenju

Điều này thực sự phù hợp với nhu cầu của tôi. Tôi đã tạo một chế độ xem tùy chỉnh ghép với một EditText bên trong. Tôi đang gặp sự cố khiến chế độ xem tùy chỉnh của tôi chỉ chấp nhận nhấp chuột nhưng không thể chỉnh sửa vì điều này sẽ khởi chạy hộp thoại chọn ngày. Giải pháp này hoạt động vì nó không vô hiệu hóa onClickListener
Neon Warge

64

Bạn có thể thử phương pháp sau:

 private void disableEditText(EditText editText) {
    editText.setFocusable(false);
    editText.setEnabled(false);
    editText.setCursorVisible(false);
    editText.setKeyListener(null);
    editText.setBackgroundColor(Color.TRANSPARENT); 
 }

Đã bật Chỉnh sửa:

Đã bật Chỉnh sửa

Đã vô hiệu hóa Chỉnh sửa:

Đã vô hiệu hóa Chỉnh sửa

Nó làm việc cho tôi và hy vọng nó sẽ giúp bạn.


1
Điều này trông giống như một TextView. Thật là đáng kinh ngạc. Đây là những gì tôi đang tìm kiếm.
Yunus

4
Trong trường hợp ai đó có cùng vấn đề với việc bật lại - bạn phải gọi editText.setFocusableInTouchMode(true)thay vì editText.setFocusable(true).
Phi tiêu Dega

61

Sử dụng điều này để vô hiệu hóa đầu vào của người dùng

android:focusable="false"

android: editable = "false" Phương thức này không được dùng nữa.


1
Đây phải là câu trả lời được chấp nhận. Đặt loại đầu vào thành 'không' như được đề xuất trong các câu trả lời khác không (luôn luôn) hoạt động. Cài đặt được bật thành 'false' sẽ ngăn chỉnh sửa nhưng cũng làm mờ văn bản có thể không mong muốn.
jerry

36

Để vô hiệu hóa chỉnh sửa EditText, tôi nghĩ rằng chúng ta có thể sử dụng focusable HOẶC enable nhưng

  1. Sử dụng android:enabled=...hoặceditText.setEnabled(...)

    Nó cũng thay đổi màu văn bản EditTextthành màu xám.
    Khi nhấp vào nó không có hiệu lực

  2. Sử dụng android:focusable=...hoặc editText.setFocusable(false)-editText.setFocusableInTouchMode(true)

    không thay đổi màu văn bản của EditText
    Khi nhấp vào, nó làm nổi bật EditTextdòng dưới cùng trong khoảng vài mili giây

Đầu ra

nhập mô tả hình ảnh ở đây


19

Như android:editable="false"được mô tả. Bạn có thể sử dụng InputType TYPE_NULL trên EditText

sử dụng như thế này:

editText.setInputType(InputType.TYPE_NULL);

1
Thích câu trả lời này vì nó không vô hiệu hóa onClickListener trên trường.
Harsh Ganatra

Phải làm gì nếu inputType là mật khẩu? TYPE_NULL làm cho mật khẩu hiển thị.
ilyamuromets

17

Như android:editable="false"bị phản đốixml

Sử dụng android:enabled="false"nó đơn giản. Tại sao sử dụng nhiều mã hơn?

Nếu bạn muốn, java classbạn cũng có thể sử dụng chương trình này

 editText.setEnabled(false);

sử dụng android: enable = "true" để kích hoạt
android_jain

8

Đơn giản:

editText.setEnabled(false);

1
Nó khác với câu trả lời trước như thế nào (như câu hỏi)?
Onik

setF Focusable (false) cũng cho phép bạn đặt OnClickListener.
Oded Breiner

5

Đặt thuộc tính dưới đây trong lớp:

editText.setFocusable(false);
editText.setEnabled(false);

Nó sẽ hoạt động trơn tru như bạn yêu cầu.


chỉ enabledđủ
ăn

5

Để vô hiệu hóa chức năng của EditText, chỉ cần sử dụng:

EditText.setInputType(InputType.TYPE_NULL);

trong trường hợp bạn muốn kích hoạt nó theo cách nào đó, thì bạn có thể sử dụng:

EditText.setInputType(InputType.TYPE_CLASS_TEXT);

Phải làm gì nếu inputType là mật khẩu? TYPE_NULL làm cho mật khẩu hiển thị.
ilyamuromets

4

nếu bạn sử dụng android:editable="false", nhật thực sẽ nhắc bạn thông báo này "android: có thể chỉnh sửa bị phản đối: Thay vào đó hãy sử dụng inputType".

Vì vậy, tôi sử dụng android:focusable="false"thay thế, nó làm việc tốt cho tôi.


4
android:editable="false"

bây giờ không dùng nữa

 YourEditText.setInputType(InputType.TYPE_NULL);

Phải làm gì nếu inputType là mật khẩu? TYPE_NULL làm cho mật khẩu hiển thị.
ilyamuromets

@ilyamuromets Câu trả lời này có thể giúp stackoverflow.com/a/16720520/7704650 với TYPE_TEXT_VARIATION_PASSWORDTheo dõi này để biết thêm nhà phát
triển.android.com/reference/android/text/InputType

Tôi muốn tắt đầu vào trong EditText trong khi bàn phím mềm được mở và người dùng đang cố gắng nhập văn bản. InputType.TYPE_NULL hoạt động tuyệt vời với isF Focusable và isF FocusableInTouchMode ở giá trị sai. Nhưng nếu inputType của trường đầu vào là textPassword thì InputType.TYPE_NULL sẽ hiển thị giá trị mật khẩu. Nếu tôi đặt InputType.TYPE_NULL | InputType.TYPE_TEXT_VariATION_PASSWORD sau đó mật khẩu cũng sẽ hiển thị và người dùng có thể nhập văn bản.
ilyamuromets


3

Vô hiệu hóa = FOCUS + CLICK + HIỆN TẠI

Vô hiệu hóa tiêu điểm, nhấp chuột và khả năng hiển thị con trỏ thực hiện mẹo cho tôi.

Đây là mã trong 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"
    />

2

Điều này sẽ làm cho edittext của bạn bị vô hiệu hóa .

editText.setEnabled(false);

Và bằng cách sử dụng này

editText.setInputType(InputType.TYPE_NULL);

Sẽ chỉ làm cho Edittext của bạn không hiển thị bảng phím mềm của bạn, nhưng nếu nó được kết nối với bàn phím vật lý, nó sẽ cho phép bạn gõ.


Phải làm gì nếu inputType là mật khẩu? TYPE_NULL làm cho mật khẩu hiển thị.
ilyamuromets

2

Tôi sử dụng google Thư viện thiết kế tài liệu mới phát hành. Trong trường hợp của tôi, nó hoạt động khi tôi sử dụng android: Focusable = "false" và android: rollerVisible = "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>

1

Trong trường hợp của tôi, tôi cần EditTextcuộn văn bản nếu không có. của dòng vượt quá maxLineskhi nó bị vô hiệu hóa. Việc thực hiện này đã làm việc hoàn hảo cho tôi.

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

1

Hãy thử cái này, hoạt động tốt cho tôi:

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

Lưu ý: Bạn cần thêm this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN); vào hoạt động của mình nếu không keyboardsẽ bật lên lần đầu tiên.


1

Như một số câu trả lời đề cập đến nó, nếu bạn vô hiệu hóa chỉnh sửa, anh ta sẽ chuyển sang màu xám và nếu bạn đặt sai tiêu điểm, con trỏ sẽ hiển thị.

Nếu bạn chỉ muốn làm điều đó với xml thì đây là một mẹo nhỏ

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

Tôi chỉ cần thêm FrameLayout xuất hiện phía trên editText và đặt nó có thể tập trung và có thể nhấp để chỉnh sửa không thể nhấp vào.


0

Điều này làm việc cho tôi:

android: tập trung = "sai"


2
Điều này khác với những gì Sampath Kumar đăng 4 năm trước?
gobrewers14

0

Từ nhận xét của @ Asymptote về câu trả lời được chấp nhận, hãy sử dụng:

myEditText.setEnabled(false);
myEditText.setInputType(InputType.TYPE_NULL);

... và Bob là chú của bạn.


0

Hôm nay tôi vẫn dùng editable="false", nhưng cũng vớifocusable="false" .

Tôi nghĩ rằng trường hợp chúng ta cần làm cho EditText không thể chỉnh sửa được là bởi vì chúng ta muốn giữ kiểu EditText của nó (với phần gạch chân đó, với gợi ý, v.v.), nhưng nó chấp nhận các đầu vào khác thay vì văn bản. Ví dụ một danh sách thả xuống.

Trong trường hợp sử dụng như vậy, chúng ta cần phải có EditTextthể nhấp (do đó enabled="false"không phù hợp). Cài đặt focusable="false"thực hiện thủ thuật này, tuy nhiên, tôi vẫn có thể giữ lâu Chỉnh sửa và dán văn bản của riêng mình vào bảng tạm . Tùy thuộc vào mã của bạn và xử lý việc này thậm chí có thể làm hỏng ứng dụng của bạn.

Vì vậy, tôi cũng đã sử dụng editable="false"và bây giờ mọi thứ đều tuyệt vời, ngoại trừ cảnh báo.


0

bạn có thể dùng android:focusable="false" nhưng cũng cần phải tắt con trỏ nếu không chức năng sao chép / dán vẫn hoạt động.

vì vậy, sử dụng

android:focusable="false"
android:cursorVisible="false"

0

Có nhiều cách để đạt được nhiều cấp độ của người khuyết tật.

  • editText.setShowSoftInputOnFocus(false);editText.setFocusable

ngăn không EditTextcho hiển thị bàn phím - viết trong một số văn bản. Nhưng con trỏ vẫn hiển thị và người dùng có thể dán vào một số văn bản.

  • editText.setCursorVisible(false)

ẩn con trỏ. Không chắc chắn tại sao bạn muốn làm điều đó tho. Người dùng có thể nhập văn bản và dán.

  • editText.setKeyListener(null)

Tôi thấy cách này thuận tiện nhất. Không có cách nào người dùng có thể nhập văn bản, nhưng widget vẫn hoạt động OnClickListenernếu bạn muốn kích hoạt hành động khi người dùng chạm vào nó

  • editText.setEnabled(false);

vô hiệu hóa hoàn toàn EditText. Nó có nghĩa đen là 'chỉ đọc', người dùng không thể nhập bất kỳ văn bản nào trong đó và (ví dụ) OnClickListener không hoạt động với nó.

Tài liệu TextEdit


0

Đặt mã này trong mã XML của bạn, Nó hoạt động.

android: FocusableInTouchMode = "false"

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.