ปิดใช้งานเคอร์เซอร์ EditText กะพริบ


คำตอบ:


355

คุณสามารถใช้แอตทริบิวต์ XML หรือฟังก์ชั่นจาวาandroid:cursorVisible="false"setCursorVisible(false)


13
น่ากลัวกันนี้กับ OnClickListener ที่ทำให้มองเห็นให้พฤติกรรมที่ถูกต้อง :)
Warpzit

1
@cerin มีวิธีซ่อนเครื่องหมายสีน้ำเงินเพื่อให้ฉันสามารถปิดการวาง แต่ให้เคอร์เซอร์ปรากฏให้เห็นเพื่อให้ผู้ใช้จะเห็นว่าเขาอยู่ที่ไหนในเขต?
limlim

9
เป็นไปได้หรือไม่ที่จะปิดใช้งานเฉพาะการกะพริบเองไม่ใช่เคอร์เซอร์?
นักพัฒนาซอฟต์แวร์ Android

35

โซลูชั่นที่สมบูรณ์แบบที่ไปไกลกว่าเป้าหมาย

เป้าหมาย: ปิดใช้งานเคอร์เซอร์กะพริบเมื่อEditTextไม่ได้อยู่ในโฟกัสและเปิดใช้งานเคอร์เซอร์กะพริบเมื่อEditTextอยู่ในโฟกัส ด้านล่างนี้จะเปิดแป้นพิมพ์เมื่อEditTextมีการคลิกและซ่อนไว้เมื่อคุณกดในแป้นพิมพ์

1) ตั้งค่า xml ของคุณภายใต้EditText:

android:cursorVisible="false"

2) ตั้ง onClickListener:

iEditText.setOnClickListener(editTextClickListener);

OnClickListener editTextClickListener = new OnClickListener() 

{

    public void onClick(View v) 
    {
         if (v.getId() == iEditText.getId()) 
        {
            iEditText.setCursorVisible(true);
        }

    }
};

3) จากนั้นonCreateจับภาพเหตุการณ์เมื่อเสร็จแล้วกดใช้OnEditorActionListenerของคุณแล้วEditTextsetCursorVisible(false)

//onCreate...

iEditText.setOnEditorActionListener(new OnEditorActionListener() {

            @Override
            public boolean onEditorAction(TextView v, int actionId,
                    KeyEvent event) {
                    iEditText.setCursorVisible(false);
                if (event != null&& (event.getKeyCode() == KeyEvent.KEYCODE_ENTER)) {
                    InputMethodManager in = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                    in.hideSoftInputFromWindow(iEditText.getApplicationWindowToken(),InputMethodManager.HIDE_NOT_ALWAYS);
                }
                return false;
            }
        });

6
KeyEvent.KEYCODE_ENTER จะไม่สามารถใช้งานกับคีย์บอร์ดทั้งหมด คุณจะต้องกล่าวถึง android โดยเฉพาะ: imeOptions = "actionDone" ในเลย์เอาต์แล้วจัดการ EditorInfo.IME_ACTION_DONE ด้วย
PsyGik

คำตอบที่ดีก็ควรแทนที่เมื่อคลิกด้วยการสัมผัสเพราะบางครั้งแก้ไขโฟกัสข้อความได้รับโดยไม่ต้องคลิกดังนั้นในกรณีนี้เคอร์เซอร์จะไม่ปรากฏ
Antwan

10

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

เพื่อเปิดใช้เคอร์เซอร์

    editText.requestFocus();
    editText.setCursorVisible(true);

เพื่อปิดการใช้เคอร์เซอร์

    editText.setCursorVisible(false);

การใช้ XML เปิดใช้งานเคอร์เซอร์ปิดการใช้งาน

   android:cursorVisible="false/true"
   android:focusable="false/true"

หากต้องการทำให้ edit_text สามารถเลือกได้ (คัดลอก / ตัด / วาง / เลือก / เลือกทั้งหมด)

   editText.setTextIsSelectable(true);

หากต้องการโฟกัสที่โหมดสัมผัสให้เขียนบรรทัดต่อไปนี้ใน XML

  android:focusableInTouchMode="true"
  android:clickable="true"
  android:focusable="true" 

โปรแกรม

  editText.requestFocusFromTouch();

เพื่อล้างโฟกัสในโหมดสัมผัส

  editText.clearFocus()

editText.clearFocus () เป็นสิ่งที่ฉันกำลังมองหา ขอบคุณ !! +1
i

3

ปัญหาเกี่ยวกับการตั้งค่าการเปิดเผยเคอร์เซอร์เป็นจริงและเท็จอาจเป็นปัญหาเนื่องจากจะลบเคอร์เซอร์จนกว่าคุณจะตั้งค่าอีกครั้งและในเวลาเดียวกันสามารถแก้ไขได้ซึ่งไม่ใช่ประสบการณ์การใช้งานที่ดี

ดังนั้นแทนที่จะใช้

setCursorVisible(false)

แค่ทำแบบนี้

        editText2.setFocusableInTouchMode(false)
        editText2.clearFocus()
        editText2.setFocusableInTouchMode(true)

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


2

ในกรณีของฉันฉันต้องการเปิดใช้งาน / ปิดใช้งานเคอร์เซอร์เมื่อเน้นการแก้ไข

ในกิจกรรมของคุณ:

@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
    if (ev.getAction() == MotionEvent.ACTION_DOWN) {
        View v = getCurrentFocus();
        if (v instanceof EditText) {
            EditText edit = ((EditText) v);
            Rect outR = new Rect();
            edit.getGlobalVisibleRect(outR);
            Boolean isKeyboardOpen = !outR.contains((int)ev.getRawX(), (int)ev.getRawY());
            System.out.print("Is Keyboard? " + isKeyboardOpen);
            if (isKeyboardOpen) {
                System.out.print("Entro al IF");
                edit.clearFocus();
                InputMethodManager imm = (InputMethodManager) this.getSystemService(Context.INPUT_METHOD_SERVICE);
                imm.hideSoftInputFromWindow(edit.getWindowToken(), 0);
            }

            edit.setCursorVisible(!isKeyboardOpen);

        }
    }
    return super.dispatchTouchEvent(ev);
}

ค่อนข้างมั่นใจว่าคุณต้องการedit.setCursorVisible(!isKeyboardOpen);ที่จะเป็นedit.setCursorVisible(isKeyboardOpen);เพื่อให้เคอร์เซอร์อยู่มองเห็นได้เมื่อแป้นพิมพ์เป็นปัจจุบัน
Daniel Storm

2

ง่ายเพิ่มบรรทัดนี้ลงในเค้าโครงแม่ของคุณ

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:focusable="true"
    android:focusableInTouchMode="true">

    <EditText
        android:inputType="text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</LinearLayout>

1

หากคุณต้องการที่จะละเว้นEdittextจากการเริ่มต้นของกิจกรรมandroid:focusableและandroid:focusableInTouchModeจะช่วยคุณ inshallah

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/linearLayout7" android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:focusable="true" android:focusableInTouchMode="true">

นี้กับของคุณLinearLayoutEdittext


0
  1. เปลี่ยนโฟกัสเป็นมุมมองอื่น (เช่น: textview หรือ Linearlayout ใน XML) โดยใช้

    android:focusableInTouchMode="true"
    android:focusable="true"
  2. ตั้ง addTextChangedListener เป็น edittext ในกิจกรรม

  3. และหลังจากนั้นเปลี่ยนของ Edittext ใส่edittext.clearFocus();

สิ่งนี้จะเปิดใช้งานเคอร์เซอร์เมื่อคีย์บอร์ดถูกเปิดและปิดการใช้งานเมื่อคีย์บอร์ดถูกปิด


0

ใน kotlin your_edittext.isCursorVisible = false


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