วิธีแก้ไขข้อความแก้ไขไม่ได้ แต่คลิกได้ใน JAVA


93

เป็นไปได้หรือไม่ที่จะทำให้EditTextคลิกได้ แต่แก้ไขไม่ได้

ฉันไม่ต้องการให้มันแก้ไขได้ (แป้นพิมพ์ไม่ควรเกิดขึ้นและเราไม่ควรเปลี่ยนคำใบ้)

อันที่จริงฉันต้องการใช้แก้ไขข้อความเป็นรูปภาพพร้อมคำใบ้ (ซึ่งไม่สามารถเปลี่ยนแปลงได้) ฉันรู้ว่าวิธีที่แท้จริงคือการใช้ an ImageViewand one TextViewแต่ฉันอยากให้ลองใช้EditTextเพราะจากนั้นฉันจะใช้มุมมองเดียวแทน 2 นอกจากนี้ทุกสิ่งยังเป็นแบบไดนามิกดังนั้นจึงไม่มี XML

สำหรับข้อกำหนดข้างต้นโซลูชันใน XML คือandroid:editable="false"แต่ฉันต้องการใช้สิ่งนี้ใน Java

แต่,

ถ้าฉันใช้: -

et.setEnabled(false);

หรือ

 et.setKeyListener(null);

ทำให้EditTextไม่สามารถแก้ไขได้ แต่ในขณะเดียวกันก็ทำให้ไม่สามารถคลิกได้เช่นกัน


วิธีการตั้งค่าet.setClickable(true)? มันอาจได้ผล
Hein

พยายามแล้ว .... แต่ไม่ได้ผล ... ความคิดอื่น ๆ
Aamir Shah

1
อาจจะลองใช้เลย์เอาต์แบบสัมพัทธ์และวางสี่เหลี่ยมผืนผ้าว่างหรืออะไรบางอย่างไว้ด้านบนของข้อความแก้ไขแล้วลองใช้สิ่งที่คลิกได้บนสี่เหลี่ยมผืนผ้า ..
อ๊ะ

คำตอบ:


171

เคล็ดลับคือ: -

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

5
แต่ถ้าคุณคัดลอกค่าบางส่วนจากฟิลด์ใด ๆ คุณสามารถวางค่าที่ได้ยินโดยกด lang tap แล้ววาง .. แนวคิดวิธีการลบ
Rishabh Agrawal

11
@ANinJa คุณสามารถตั้งค่า long clickable เป็น false ได้เช่น et.setLongClickable (false);
Luis

อืมเคอร์เซอร์ถูกไฮไลต์แบบแปลก ๆ เมื่อคลิก / longclick ... แต่ฉันไม่มีวิธีที่ดีกว่านี้ : /
Martin Pfeffer

1
สมบูรณ์แบบ! คุณอาจต้องเพิ่ม et.setLongClickable (false) เพื่อหลีกเลี่ยงการคัดลอก / วางเช่นกัน
thanhbinh84

1
สมบูรณ์แบบคุณเป็นหมอ?
Iman Marashi

23

เนื่องจากeditableเลิกใช้งานแล้ว คุณสามารถใช้android:inputTypeเป็นไม่มีในการออกแบบ xml หรือเป็นInputType.TYPE_NULLในการเข้ารหัส

การออกแบบ 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"/>

การเข้ารหัส

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

และด้านล่างนี้คือเหตุการณ์คลิกของ edittext

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

22

คุณสามารถตั้งค่าได้EditTextโดยใช้รหัสจาวาว่ากำลังล่มสลาย: -

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

หรือโดยใช้โค้ดด้านล่างในไฟล์ XML สำหรับEditText.

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

9

คุณสามารถใช้สิ่งนี้ ..

android:focusableInTouchMode="false"

เพื่อทำให้การแก้ไขข้อความไม่สามารถแก้ไขได้ใน xml และสำหรับเหตุการณ์ที่คลิกได้คุณสามารถใช้เหตุการณ์ setOnTouchListener ()เพื่อทำสิ่งเดียวกันเช่น ...

editText.setOnTouchListener(new OnTouchListener() {

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

1
ดูเหมือนว่าandroid:focusableInTouchMode="false"จำเป็นเช่นกัน ( android:focusable="false"คนเดียวใช้ไม่ได้) ใน Android O อย่างน้อยก็ใน DP2
xip

7

android:editable เลิกใช้งานแล้ว แต่คุณสามารถทำ stg ได้ดังนี้:

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

ฉันใช้ cade ด้านบนสำหรับการแก้ไขซึ่งฉันใช้ตัวเลือกเพื่อตั้งค่าข้อมูลคุณสามารถใช้รูปแบบการป้อนข้อมูลกับสิ่งนี้


7

Edittext เปิดและปิดการใช้งานสำหรับการแก้ไขเช่นนี้

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

ผ่านรหัสจาวา

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

ผ่าน xml

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

0

สำหรับฉันไม่มีคำตอบใดที่ทำให้เกิดโซลูชันที่ใช้งานได้อย่างสมบูรณ์

ตัวอย่างการแก้ไขของฉันhttps://www.youtube.com/watch?v=oUA4Cuxfdqc

คำแนะนำ (เป็นมิตรกับสิ่งแวดล้อม)โปรดสังเกตความคิดเห็นเล็กน้อยในรหัส

สร้างคลาส Java สำหรับกำหนดเองEditTextชื่อEditTextDispatched.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;
    }

}

อ้างอิงEditTextDispatchedใน xml ของคุณ (คุณจะต้องเปลี่ยนชื่อ 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" />

ในการเรียก:

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


0

ฉันรู้ว่าคำถามนี้ได้รับคำตอบแล้ว แต่เพื่อให้คำตอบที่เป็นปัจจุบันมากขึ้น (เช่นปี 2018) นี่คือการตั้งค่าที่ฉันใช้เพื่อให้ได้เอฟเฟกต์ที่ร้องขอ (เช่นไม่ป้อนข้อมูลหรือแก้ไขได้):

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

ใช่นี่คือ ANKO เนื่องจากฉันไม่ได้ใช้ XML ในโครงการ Android ใด ๆ ของฉันอีกต่อไป 'inputType' ดูแลการเลิกใช้งาน 'isEditable'


0

ในปี 2020 หากคุณสนใจเกี่ยวกับการช่วยการเข้าถึงคุณควรหลีกเลี่ยงการตั้งค่าet.setFocusable(false);เนื่องจากจะทำให้ EditText ไม่สามารถเข้าถึงได้โดยใช้การนำทางด้วยคีย์บอร์ด

นี่คือทางออกของฉัน:

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

คุณสามารถทำได้android:inputMethod="@null"ในของคุณEditTextและมันจะไม่แสดงเคอร์เซอร์หรือแป้นพิมพ์จากนั้นคุณสามารถเข้าใจการคลิกผ่านการตั้งค่าฟังได้อย่างง่ายดาย

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