Cách làm cho văn bản chỉnh sửa không thể chỉnh sửa nhưng có thể nhấp được trong JAVA


91

Có thể làm cho EditTextnhấp chuột được nhưng không thể chỉnh sửa.

Tôi không muốn nó có thể chỉnh sửa được (Bàn phím không xuất hiện và chúng ta không thể thay đổi gợi ý)

Trên thực tế, tôi muốn sử dụng Chỉnh sửa văn bản đơn giản là một hình ảnh với gợi ý (không thể thay đổi). Tôi biết cách thực tế là sử dụng một ImageViewvà một TextView, nhưng tôi muốn nó thử với EditTextvì sau đó tôi sẽ chỉ sử dụng một chế độ xem thay vì 2. Ngoài ra, mọi thứ đều là động nên không có XML.

Đối với yêu cầu trên, giải pháp trong XML là android:editable="false"nhưng tôi muốn sử dụng giải pháp này trong Java.

Nhưng,

Nếu tôi sử dụng: -

et.setEnabled(false);

hoặc là

 et.setKeyListener(null);

Nó làm cho nó EditTextkhông thể EDITABLE nhưng đồng thời nó cũng làm cho nó không thể nhấp được.


Làm thế nào về thiết lập et.setClickable(true)? Có thể đấy.
Hein

đã cố gắng .... nhưng đã không làm việc ... bất kỳ suy nghĩ khác
Aamir Shah

1
có lẽ cố gắng sử dụng bố trí tương đối và đưa một hình chữ nhật rỗng hoặc một cái gì đó trên đầu trang của EditText, và cố gắng điều có thể click vào rect ..
Wops

Câu trả lời:


168

Bí quyết ở đây là: -

et.setFocusable(false);
et.setClickable(true);

5
nhưng nếu bạn đã sao chép một số giá trị từ lĩnh vực bất kỳ, bạn có thể dán giá trị nghe bằng cách nhấn lang tap và dán .. bất kỳ ý tưởng làm thế nào để loại bỏ
Rishabh Agrawal

11
@ANinJa bạn có thể đặt giá trị có thể nhấp dài thành false, tức là et.setLongClickable (false);
Luis

Rất tiếc, con trỏ được đánh dấu một cách kỳ lạ khi nhấp / nhấp chuột dài ... Nhưng tôi không có cách tiếp cận tốt hơn. : /
Martin Pfeffer

1
Hoàn hảo! bạn có thể cần thêm et.setLongClickable (false) để tránh copy / paste
thanhbinh84

1
Hoàn hảo, Bạn là bác sĩ?
Iman Marashi

22

bạn có thể đặt EditTextbằng cách sử dụng mã java làm dự phòng: -

edittext.setFocusable(false);
edittext.setClickable(true);

hoặc bằng cách sử dụng mã dưới đây trong tệp XML cho EditText.

android:editable="false" 
android:inputType="none"  

22

Như editablekhông được dùng nữa. bạn có thể sử dụng android:inputTypenhư không có trong thiết kế xml hoặc như InputType.TYPE_NULL trong mã hóa.

Thiết kế XML

<android.support.v7.widget.AppCompatEditText
    android:id="@+id/edt"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:clickable="true"
    android:focusable="false"
    android:inputType="none"
    android:text="EditText"/>

Mã hóa

edt.setClickable(true);
edt.setFocusable(false);
edt.setInputType(InputType.TYPE_NULL);

Và dưới đây là sự kiện nhấp chuột của edittext

edt.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Toast.makeText(YourActivity.this,"edt click", Toast.LENGTH_LONG).show();
    }
});

Làm việc như một sự quyến rũ đối với tôi
Karim Bibars

8

Bạn có thể sử dụng cái này ..

android:focusableInTouchMode="false"

để làm cho văn bản chỉnh sửa không thể chỉnh sửa trong xml. Và đối với sự kiện có thể nhấp, bạn có thể sử dụng sự kiện setOnTouchListener () để làm điều tương tự như ..

editText.setOnTouchListener(new OnTouchListener() {

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        // TODO Auto-generated method stub
                        //do your stuff here..
        return false;
    }
});

1
Có vẻ như android:focusableInTouchMode="false"cũng được yêu cầu ( android:focusable="false"một mình không hoạt động) trong Android O. Ít nhất, trong DP2.
xip

7

android:editable không được dùng nữa nhưng bạn có thể làm stg như sau:

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

Tôi đã sử dụng cade ở trên cho các biên tập mà tôi sử dụng bộ chọn để đặt dữ liệu. Bạn có thể sử dụng bố cục đầu vào với điều này.


7

Edittext bật và tắt cho phần chỉnh sửa như thế này

EditText edit = (EditText) findviewby(R.id.edittext);

Thông qua mã java

edit.setEnabled(false); //non editable
edit.setEnabled(true); //editable

Thông qua xml

<EditText
    android:id="@+id/otp_mpin"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:editable="false"
    android:focusable="false"/>

0

Đối với tôi không có câu trả lời nào dẫn đến một giải pháp hoàn toàn hiệu quả.

Giới thiệu bản sửa lỗi của tôi https://www.youtube.com/watch?v=oUA4Cuxfdqc

Hướng dẫn (thân thiện với noob) , vui lòng lưu ý một số nhận xét trong mã.

Tạo một lớp Java cho một tùy chỉnh có EditTexttên là EditTextDispished.java

import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.RelativeLayout;

/**
 * @author Martin Pfeffer
 * @see <a href="https://celox.io">https://celox.io</a>
 */
public class EditTextDispatched extends android.support.v7.widget.AppCompatEditText {

    private static final String TAG = "DispatchingEditText";

    private boolean editable = true;

    public EditTextDispatched(Context context) {
        super(context);
    }

    public EditTextDispatched(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public EditTextDispatched(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    // get the current state
    public boolean isEditable() {
        return editable;
    }

    // set your desired behaviour
    public void setEditable(boolean editable) {
        this.editable = editable;
    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent motionEvent) {

        if (editable) {
            // default behaviour of an EditText
            super.dispatchTouchEvent(motionEvent);
            return true;
        }

        // achieve the click-behaviour of a TextView (it's cuztom)
        ((RelativeLayout) getParent()).onTouchEvent(motionEvent);
        return true;
    }

}

Tham chiếu EditTextDispatchedtrong xml của bạn (bạn sẽ phải thay đổi tên-pgk):

  <io.celox.brutus.EditTextDispatched
    android:id="@+id/row_field_value"
    style="@style/row_field_text_display"
    android:layout_alignParentBottom="true"
    android:text="@string/sample_field_value" />

Để gọi:

private void changeEditTextBehaviour(EditTextDispatched value, boolean editable) {
    value.setEditable(editable);
    value.setEnabled(editable);
}


0

Tôi biết câu hỏi này đã được trả lời nhưng để đưa ra câu trả lời hiện tại hơn (tức là năm 2018), đây là thiết lập tôi sử dụng để đạt được hiệu ứng được yêu cầu (tức là không đầu vào hoặc có thể chỉnh sửa):

    val etUserLoc: EditText = themedEditText(R.style.Pale_Blue_Text_Bold_13) {
                id = R.id.et_comp_user_keys_var_user_location
                inputType = InputType.TYPE_NULL
                isClickable = true
                isFocusable = false
                textColor = resources.getColor(R.color.magenta)  // overrides the default theme color
                text = Editable.Factory.getInstance().newEditable(resources.getString(R.string.loc_swakopmund))
            }.lparams(width = matchConstraint, height = matchParent) {   }

Có, đây là ANKO vì tôi không còn sử dụng XML trong bất kỳ Dự án Android nào của mình nữa. 'InputType' xử lý việc ngưng sử dụng 'isEditable'.


0

Kể từ năm 2020, nếu bạn cũng quan tâm đến khả năng truy cập, bạn nên tránh cài đặt et.setFocusable(false);vì điều đó sẽ khiến EditText không thể truy cập được bằng điều hướng Bàn phím.

Đây là giải pháp của tôi:

Kotlin

editText.isFocusableInTouchMode = false

editText.isLongClickable = false //this will prevent copy and paste

editText.setOnClickListener {
   // handle the click
   // this will automatically make the edittext clickable = true
}

-1

bạn cũng có thể làm android:inputMethod="@null"trong của bạn EditTextvà nó sẽ không hiển thị con trỏ hoặc bàn phím và sau đó bạn có thể dễ dàng nắm bắt được trình nghe nhấp qua cài đặt.

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.