ปิดการใช้งาน EditText ใน Android


195

ในแอปพลิเคชันของฉันฉันมี EditText ที่ผู้ใช้มีสิทธิ์การเข้าถึงเพื่ออ่านไม่ใช่การเข้าถึงเพื่อเขียน

android:enabled="false"ในรหัสฉันชุด

แม้ว่าพื้นหลังของ EditText จะเปลี่ยนเป็นสีเข้มเมื่อฉันคลิกบนแป้นพิมพ์ก็จะปรากฏขึ้นและฉันสามารถเปลี่ยนข้อความได้

ฉันควรตั้งค่าอะไรให้ปิดใช้งาน EditText


2
เป็นไปได้ที่จะรักษาทั้งสไตล์ของมุมมองและพฤติกรรมการเลื่อน หากต้องการปิดการใช้งานEditTextในขณะที่ยังคงรักษาคุณสมบัตินี้ไว้ให้ใช้UI.setReadOnly(myEditText, true)จากไลบรารีนี้ หากคุณต้องการทำซ้ำลักษณะการทำงานนี้โดยไม่มีไลบรารีให้ตรวจสอบซอร์สโค้ดสำหรับวิธีการขนาดเล็กนี้
caw

คำตอบ:


245

android:editable="false"ผมเชื่อว่าที่ถูกต้องจะเป็นชุด

และถ้าคุณสงสัยว่าทำไมลิงก์ของฉันชี้ไปที่คุณลักษณะของTextViewคุณคำตอบนั้นเป็นเพราะEditTextสืบทอดมาจากTextView:

EditText เป็นแผ่นไม้อัดบางกว่า TextView ที่กำหนดค่าตัวเองให้สามารถแก้ไขได้

อัปเดต:
ดังที่กล่าวไว้ในความคิดเห็นด้านล่างeditableเลิกใช้แล้ว ( ตั้งแต่ระดับ API 3 ) คุณควรใช้แทนinputType(ด้วยค่าnone)


ขอบคุณ Nailuj โชคไม่ดีที่มันไม่ทำงาน หลังจากเพิ่มแป้นพิมพ์คำแนะนำของคุณจะปรากฏขึ้นและมีความสามารถในการเปลี่ยนข้อความ
Hesam

18
android: ไม่สามารถแก้ไขได้ android: inputType = "none" ควรใช้แทน แต่มีข้อผิดพลาดและไม่สามารถใช้งานได้ มันจะดีถ้าเราทุกคนติดปัญหาที่นี่: code.google.com/p/android/issues/detail?id=2854
Viktor Brešan

85
editText.setEnabled(false); editText.setInputType(InputType.TYPE_NULL);
Asymptote

28
android:editable="false" android:focusable="false"ใช้งานได้ดีสำหรับฉัน (ลืมเกี่ยวกับการเลิกฉันคิดว่า Android: แก้ไขได้ไม่มีอะไรจะทำอย่างไรกับ Android: inputType)
มูฮัมหมัดบาบา

8
สำหรับผู้ที่ใช้ Android: inputType = "none" ไม่ทำงานให้ลอง: android: inputType = "none" กับ android: focusable = "false"
Surendra Kumar

162

ใช้EditText.setFocusable(false) เพื่อปิดการแก้ไข
EditText.setFocusableInTouchMode(true)เพื่อเปิดใช้งานการแก้ไข;


ใช้งานได้ แต่ไม่ใช่วิธีปฏิบัติที่ดีเพราะมุมมองดูเหมือนว่าสามารถแก้ไขได้ แต่ไม่สามารถทำได้ ทำงานได้ดีสำหรับฉันเพราะมุมมองของฉันมีพื้นหลังที่กำหนดเองดังนั้น +1
kaneda

4
@kaneda ฉันชอบสิ่งนี้จริง ๆ ฉันไม่ต้องการให้กล่องของฉันเป็นสีเทา :)
Doomsknight

1
ใน Android 4.4 ตัวเลือกนี้จะเก็บสีข้อความดั้งเดิมไว้ การใช้editText.setEnabled(false);จะเปลี่ยนสีข้อความเป็นสีเทา อย่างไรก็ตามสปินเนอร์ไม่เปลี่ยนสีของตัวอักษรเมื่อใช้setEnabledทำให้มันเป็นประสบการณ์ที่ไม่คงที่
tbraun

ทำไมไม่setFocusable(true)? ดูลิงค์นี้สำหรับความแตกต่างระหว่างsetFocusable()และsetFocusableInTouchMode(): stackoverflow.com/questions/23799064/…
kenju

มันเหมาะกับความต้องการของฉันจริงๆ ฉันสร้างมุมมองที่กำหนดเองแบบผสมพร้อมกับ EditText ด้านใน ฉันมีปัญหาในการทำให้มุมมองที่กำหนดเองของฉันยอมรับการคลิก แต่ไม่สามารถแก้ไขได้เนื่องจากจะเปิดใช้กล่องโต้ตอบตัวเลือกวันที่ โซลูชันนี้ใช้งานได้เนื่องจากไม่ปิดการใช้งาน
บนClickListeners

64

คุณสามารถลองวิธีการต่อไปนี้:

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

เปิดใช้งาน EditText:

เปิดใช้งาน EditText

ปิดใช้งาน EditText:

ปิดใช้งาน EditText

มันใช้งานได้สำหรับฉันและหวังว่าจะช่วยคุณ


1
ดูเหมือนว่า TextView มันน่าทึ่งมาก นี่คือสิ่งที่ฉันกำลังมองหา
Yunus

4
ในกรณีที่มีคนที่มีปัญหาเดียวกันกับการเปิดใช้งานกลับ - คุณได้ที่จะเรียกแทนeditText.setFocusableInTouchMode(true) editText.setFocusable(true)
Dart Dega

61

ใช้สิ่งนี้เพื่อปิดการใช้งานการป้อนข้อมูลของผู้ใช้

android:focusable="false"

android: editable = "false"วิธีนี้เลิกใช้แล้ว


1
นี่ควรเป็นคำตอบที่ยอมรับได้ การตั้งค่าประเภทอินพุตเป็น 'none' ตามคำแนะนำในคำตอบอื่น ๆ อาจไม่ได้ผลเสมอไป เปิดใช้งานการตั้งค่าเป็น 'เท็จ' ป้องกันการแก้ไข แต่ยังหรี่ข้อความที่อาจต้องการหรือไม่ต้องการ
jerry

36

สำหรับการปิดการใช้งานการแก้ไขEditTextผมคิดว่าเราสามารถใช้focusable หรือ enableแต่

  1. ใช้android:enabled=...หรือeditText.setEnabled(...)

    นอกจากนี้ยังเปลี่ยนสีข้อความเป็นสีEditTextเทา
    เมื่อคลิกแล้วจะไม่มีผลกระทบใด ๆ

  2. ใช้android:focusable=...หรือeditText.setFocusable(false)-editText.setFocusableInTouchMode(true)

    มันไม่ได้เปลี่ยนสีข้อความของEditText
    เมื่อคลิกมันไฮไลท์EditTextบรรทัดด้านล่างประมาณไม่กี่มิลลิวินาที

เอาท์พุต

ป้อนคำอธิบายรูปภาพที่นี่


คุณสามารถเพิ่มandroid:longClickable="false"พร้อมกับandroid:focusable="false"ลบไฮไลท์ชั่วคราวเมื่อแตะที่มุมมองนี้ สิ่งนี้จะป้องกันไม่ให้ป๊อปอัป "เลือกทั้งหมด" ปรากฏขึ้น
CzarMatt

19

ตามที่android:editable="false"อธิบายไว้คุณสามารถใช้ InputType TYPE_NULLบน EditText

ใช้แบบนี้:

editText.setInputType(InputType.TYPE_NULL);

1
ชอบคำตอบนี้เพราะไม่ได้ปิดการใช้งาน onClickListener บนสนาม
Harsh Ganatra

จะทำอย่างไรถ้า inputType เป็นรหัสผ่าน TYPE_NULL ทำให้มองเห็นรหัสผ่าน
ilyamuromets

17

ตามที่android:editable="false"ไม่สนับสนุนในxml

ใช้android:enabled="false"มันง่าย ทำไมต้องใช้รหัสเพิ่มเติม

หากคุณต้องการjava classคุณสามารถใช้โปรแกรมนี้ได้

 editText.setEnabled(false);

ใช้ android: enabled = "true" เพื่อเปิดใช้งาน
android_jain

8

เพียง:

editText.setEnabled(false);

1
มันแตกต่างจากคำตอบก่อนหน้า (เพื่อเป็นคำถาม) อย่างไร
Onik

setFocusable (false) ยังให้คุณตั้ง OnClickListener
Oded Breiner

5

ตั้งค่าคุณสมบัติด้านล่างในคลาส:

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

มันจะทำงานได้อย่างราบรื่นตามที่คุณต้องการ


enabledเพียงพอแล้วเท่านั้น
ateebahmed

5

หากต้องการปิดใช้งานฟังก์ชันการทำงานของ EditText เพียงใช้:

EditText.setInputType(InputType.TYPE_NULL);

ในกรณีที่คุณต้องการเปิดใช้งานบางวิธีคุณสามารถใช้:

EditText.setInputType(InputType.TYPE_CLASS_TEXT);

จะทำอย่างไรถ้า inputType เป็นรหัสผ่าน TYPE_NULL ทำให้มองเห็นรหัสผ่าน
ilyamuromets

4

ถ้าคุณใช้ android:editable="false" eclipse จะเตือนให้คุณทราบข้อความนี้ "android: editable is deprecated: ใช้ inputType แทน"

ดังนั้นฉันใช้android:focusable="false"แทนมันใช้งานได้ดีสำหรับฉัน


4
android:editable="false"

เลิกใช้แล้วในขณะนี้

 YourEditText.setInputType(InputType.TYPE_NULL);

จะทำอย่างไรถ้า inputType เป็นรหัสผ่าน TYPE_NULL ทำให้มองเห็นรหัสผ่าน
ilyamuromets

@ilyamuromets คำตอบนี้อาจช่วยstackoverflow.com/a/16720520/7704650ด้วยTYPE_TEXT_VARIATION_PASSWORDทำตามนี้เพื่อดูdeveloper.android.com/reference/android/text/InputType
emkarachchi

ฉันต้องการที่จะปิดการใช้งานการป้อนข้อมูลใน EditText ในขณะที่เปิดแป้นพิมพ์อ่อนและผู้ใช้พยายามป้อนข้อความ InputType.TYPE_NULL ใช้งานได้ดีกับ isFocusable และ isFocusableInTouchMode ในค่าเท็จ แต่ถ้า inputType ของฟิลด์อินพุตเป็น textPassword ดังนั้น InputType.TYPE_NULL จะทำให้มองเห็นค่ารหัสผ่านได้ หากฉันตั้ง InputType.TYPE_NULL | InputType.TYPE_TEXT_VARIATION_PASSWORD จากนั้นรหัสผ่านก็จะปรากฏให้เห็นและผู้ใช้อาจป้อนข้อความ
ilyamuromets


3

ซึ่งจะทำให้คุณ EditText คนพิการ

editText.setEnabled(false);

และโดยการใช้สิ่งนี้

editText.setInputType(InputType.TYPE_NULL);

จะทำให้ Edittext ของคุณไม่แสดงซอฟต์คีย์บอร์ดของคุณ แต่ถ้ามันเชื่อมต่อกับแป้นพิมพ์จริงมันจะให้คุณพิมพ์


จะทำอย่างไรถ้า inputType เป็นรหัสผ่าน TYPE_NULL ทำให้มองเห็นรหัสผ่าน
ilyamuromets

3

ปิดใช้งาน = FOCUS + คลิก + เคอร์เซอร์

การปิดใช้งานโฟกัสคลิกและการมองเห็นเคอร์เซอร์นั้นเป็นสิ่งที่ฉันทำได้

นี่คือรหัสใน 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

ฉันใช้ห้องสมุดออกแบบวัสดุที่เพิ่งเปิดตัวของ Google ในกรณีของฉันมันใช้งานได้เมื่อฉันใช้ android: focusable = "false" และ android: cursorVisible = "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

ในกรณีของฉันฉันต้องการEditTextเลื่อนข้อความหากไม่มี จำนวนบรรทัดเกินmaxLinesเมื่อปิดการใช้งาน การใช้งานนี้ทำงานได้อย่างสมบูรณ์แบบสำหรับฉัน

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

ลองอันนี้ใช้งานได้ดีสำหรับฉัน:

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

หมายเหตุ: คุณต้องเพิ่มthis.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN); กิจกรรมของคุณมิฉะนั้นkeyboardจะป๊อปอัปในครั้งแรก


1

ตามที่คำตอบบางคำพูดถึงมันหากคุณปิดการใช้งาน EditText เขาจะกลายเป็นสีเทาและหากคุณตั้งค่าเท็จที่สามารถโฟกัสได้เคอร์เซอร์จะแสดง

หากคุณต้องการที่จะทำเฉพาะกับ xml นี่เป็นเคล็ดลับ

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

ฉันเพียงแค่เพิ่ม FrameLayout ปรากฏขึ้นเหนือ editText และตั้งค่าที่สามารถโฟกัสได้และคลิกได้เพื่อให้ editText ไม่สามารถคลิกได้


0

สิ่งนี้ใช้ได้กับฉัน:

หุ่นยนต์: ที่สามารถโฟกัส = "false"


2
สิ่งนี้แตกต่างจาก Sampath Kumar อย่างไรเมื่อ 4 ปีที่แล้ว?
gobrewers14

0

จากความคิดเห็นของ @ Asymptote เกี่ยวกับคำตอบที่ยอมรับให้ใช้:

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

... และบ๊อบเป็นลุงของคุณ


0

วันนี้ผมยังคงใช้แต่ยังมีeditable="false"focusable="false"

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

ในกรณีการใช้งานดังกล่าวเราจำเป็นต้องEditTextคลิกได้ (จึงenabled="false"ไม่เหมาะ) การตั้งค่าfocusable="false"ทำเคล็ดลับนี้อย่างไรก็ตามฉันยังสามารถค้างไว้ที่ EditText และวางข้อความของตัวเองลงบนคลิปบอร์ดได้ได้ ขึ้นอยู่กับรหัสและการจัดการของคุณสิ่งนี้อาจทำให้แอปของคุณเสียหาย

ดังนั้นฉันจึงใช้editable="false"และตอนนี้ทุกอย่างยอดเยี่ยมยกเว้นคำเตือน


0

คุณสามารถใช้ได้ android:focusable="false"แต่ยังต้องปิดการใช้งานเคอร์เซอร์มิฉะนั้นฟังก์ชั่นคัดลอก / วางจะยังคงทำงานได้

ดังนั้นใช้

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

0

มีหลายวิธีที่จะบรรลุคนพิการหลายระดับ

  • editText.setShowSoftInputOnFocus(false); และ editText.setFocusable

ป้องกันไม่ให้EditTextแสดงแป้นพิมพ์ - เขียนในข้อความบางส่วน แต่เคอร์เซอร์ยังคงมองเห็นได้และผู้ใช้สามารถวางในข้อความบางส่วน

  • editText.setCursorVisible(false)

ซ่อนเคอร์เซอร์ ไม่แน่ใจว่าทำไมคุณต้องการทำเช่นนั้น ผู้ใช้สามารถป้อนข้อความ & วาง

  • editText.setKeyListener(null)

ฉันพบว่าวิธีนี้สะดวกที่สุด ไม่มีวิธีที่ผู้ใช้สามารถป้อนข้อความได้ แต่วิดเจ็ตยังคงทำงานได้OnClickListenerหากคุณต้องการทริกเกอร์การกระทำเมื่อผู้ใช้แตะ

  • editText.setEnabled(false);

EditTextปิดการใช้งานได้อย่างสมบูรณ์ มันเป็น 'อ่านอย่างเดียว' อย่างแท้จริงผู้ใช้ไม่สามารถป้อนข้อความใด ๆ ในนั้นและ (ตัวอย่าง) OnClickListener ไม่ได้งานได้

เอกสาร TextEdit


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