วิธีการตั้งค่าตำแหน่งเคอร์เซอร์ใน EditText?


235

มีสองEditTextขณะที่โหลดหน้าข้อความตั้งอยู่ใน EditText แรกดังนั้นเคอร์เซอร์จะอยู่ที่ตำแหน่งเริ่มต้นEditTextฉันต้องการตั้งตำแหน่งเคอร์เซอร์ใน EditText ที่สองซึ่งไม่มีข้อมูล ทำอย่างไร


2
คุณสามารถตั้งค่าแรงโน้มถ่วงของมันเป็น 'center'.it จะตั้งค่าเคอร์เซอร์ให้อยู่กึ่งกลางโดยอัตโนมัติ ข้อความของคุณก็จะอยู่กึ่งกลางแล้ว
Hiral Vadodaria

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

คำตอบ:


483

ในกรณีที่ตำแหน่งเป็น int:

editText1.setSelection(position)

มีวิธีการทำเช่นนี้ที่ไฟล์ XML?
kike

@kike ฉันไม่คิดอย่างนั้น
atasoyh

1
ใช้ android: ตัวเลือกใน xml ที่มีการเชื่อมโยงข้อมูล
Mubarak Mohideen

96

ฉันได้ทำวิธีนี้เพื่อตั้งตำแหน่งเคอร์เซอร์ไปที่จุดสิ้นสุดของข้อความหลังจากอัปเดตข้อความของ EditText โดยทางโปรแกรม ที่นี่etmsgคือ EditText

etmsg.setText("Updated Text From another Activity");
int position = etmsg.length();
Editable etext = etmsg.getText();
Selection.setSelection(etext, position);

4
+1 อา! ดีมันช่วยให้ฉันตั้งตำแหน่งเคอร์เซอร์ใน edittext
Dharmendra

2
สิ่งนี้ไม่ได้ผลสำหรับฉัน ฉันมีสตริง Spannable ใน EditText ของฉัน มีวิธีแก้ปัญหาสำหรับสิ่งนั้นหรือไม่?
toobsco42

1
@ toobsco42 สวัสดีฉันเพิ่งลองใช้ Spannable String ใน edittext .. ตรวจสอบpastebin.com/i02ZrNw4นี้และใช้งานได้ตามที่คาดไว้ .. ตรวจสอบและเปรียบเทียบ
MKJParekh

เป็นไปได้จากไฟล์ xml หรือไม่ @MKJParekh
Yog Guru

1
ดูเหมือนว่าจะทำเช่นเดียวกัน:etmsg.setText("my new text..."); etmsg.setSelection(etmsg.length());
Steve Blackwell

37

วิธีการตั้งค่าตำแหน่งเคอร์เซอร์ EditText ใน Android

ด้านล่างรหัสคือตั้งค่าเคอร์เซอร์เป็นเริ่มต้นในEditText:

 EditText editText = (EditText)findViewById(R.id.edittext_id);
 editText.setSelection(0);

ด้านล่างรหัสคือตั้งค่าเคอร์เซอร์เป็นจุดสิ้นสุดของEditText:

EditText editText = (EditText)findViewById(R.id.edittext_id);
editText.setSelection(editText.getText().length());

ด้านล่างรหัสคือตั้งค่าเคอร์เซอร์หลังตำแหน่งอักขระที่ 2:

 EditText editText = (EditText)findViewById(R.id.edittext_id);
 editText.setSelection(2);

17

ฉันต้องการตั้งตำแหน่งเคอร์เซอร์ใน edittext ซึ่งไม่มีข้อมูล

มีตำแหน่งเดียวใน EditText ที่ว่างเปล่าsetSelection(0)เท่านั้น

หรือคุณหมายถึงคุณต้องการให้ความสำคัญกับEditTextกิจกรรมของคุณเมื่อเปิด? ในกรณีนั้น requestFocus()


setSelection (0) ไม่ทำงานฉันไม่ต้องการโฟกัสไปที่ EditText ที่สองฉันเพียงต้องการตั้งค่าเคอร์เซอร์ใน EditText ที่สอง
nila

3
หากฉันจำได้อย่างถูกต้องเมื่อ EditText ร้องขอโฟกัสเคอร์เซอร์จะถูกตั้งค่า อ่านสิ่งนี้
Reno


9

ให้ editText2 เป็นมุมมอง EditText ที่สองของคุณจากนั้นใส่โค้ดต่อไปนี้ในonResume ()

editText2.setFocusableInTouchMode(true);
editText2.requestFocus();

หรือใส่

<requestFocus />

ในเค้าโครง xml ของคุณในมุมมอง EditText ที่สอง


7

บางเวลาแก้ไข donot editText.setSelection(position);เคอร์เซอร์ข้อความมาที่ตำแหน่งโดยเฉพาะอย่างยิ่งถ้าเราใช้โดยตรง ในกรณีนี้คุณสามารถลอง

editText.post(new Runnable() {
                @Override
                public void run() {
                    editText.setSelection(string.length());
                }
            });

7

หากคุณต้องการวางเคอร์เซอร์ในตำแหน่งที่แน่นอนบน EditText คุณสามารถใช้:

yourEditText.setSelection(position);

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

yourEditText.setSelection(startPosition, endPosition);

โปรดทราบว่าการตั้งค่าการเลือกอาจมีความยุ่งยากเนื่องจากคุณสามารถวางเคอร์เซอร์ไว้ก่อนหรือหลังตัวอักษรภาพด้านล่างอธิบายถึงวิธีการจัดทำดัชนีในกรณีนี้:

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

yourEditText.length()ดังนั้นถ้าคุณต้องการเคอร์เซอร์ในตอนท้ายของข้อความเพียงตั้งค่าให้



4

เพื่อเป็นการเตือน: หากคุณใช้edittext.setSelection()เพื่อตั้งค่าเคอร์เซอร์และมันไม่ทำงานในขณะที่ตั้งค่าalertdialogตัวอย่างตรวจสอบให้แน่ใจว่าได้ตั้งค่าselection()หลังจากที่กล่องโต้ตอบถูกสร้างขึ้นแล้ว

ตัวอย่าง:

AlertDialog dialog = builder.show();
input.setSelection(x,y);

3

รหัสนี้จะช่วยให้คุณแสดงเคอร์เซอร์ที่ตำแหน่งสุดท้ายของการแก้ไขข้อความ

 editText.requestFocus();
 editText.setSelection(editText.length());


1

ฉันจะไม่รับเมธอด setSelection () โดยตรงดังนั้นฉันจึงทำแบบด้านล่างและทำงานเหมือนมีเสน่ห์

EditText editText = (EditText)findViewById(R.id.edittext_id);
editText.setText("Updated New Text");
int position = editText.getText().length();
Editable editObj= editText.getText();
Selection.setSelection(editObj, position);

1

หากคุณต้องการตั้งค่าเคอร์เซอร์หลังnตัวละครจากขวาไปซ้ายคุณต้องทำเช่นนี้

edittext.setSelection(edittext.length()-n);

หากข้อความของ edittext เป็นเช่นนั้น

version<sub></sub>

และคุณต้องการเลื่อนเคอร์เซอร์ไปที่ตำแหน่งที่ 6 จากด้านขวา

จากนั้นมันจะเลื่อนเคอร์เซอร์ไปที่ -

    version<sub> </sub>
                ^



0

ตั้งเคอร์เซอร์ไปที่แถวและคอลัมน์

คุณสามารถใช้รหัสต่อไปนี้เพื่อรับตำแหน่งใน EditText ของคุณที่สอดคล้องกับแถวและคอลัมน์ที่แน่นอน จากนั้นคุณสามารถใช้editText.setSelection(getIndexFromPos(row, column))เพื่อตั้งตำแหน่งเคอร์เซอร์ การเรียกใช้เมธอดต่อไปนี้สามารถทำได้:

  • getIndexFromPos(x, y) ไปที่คอลัมน์ y ของบรรทัด x
  • getIndexFromPos(x, -1) ไปที่คอลัมน์สุดท้ายของบรรทัด x
  • getIndexFromPos(-1, y) ไปที่คอลัมน์ y ของบรรทัดสุดท้าย
  • getIndexFromPos(-1, -1) ไปที่คอลัมน์สุดท้ายของบรรทัดสุดท้าย

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

static final String LINE_SEPARATOR = System.getProperty("line.separator");

int getIndexFromPos(int line, int column) {
    int lineCount = getTrueLineCount();
    if (line < 0) line = getLayout().getLineForOffset(getSelectionStart());  // No line, take current line
    if (line >= lineCount) line = lineCount - 1;  // Line out of bounds, take last line

    String content = getText().toString() + LINE_SEPARATOR;
    int currentLine = 0;
    for (int i = 0; i < content.length(); i++) {
        if (currentLine == line) {
            int lineLength = content.substring(i, content.length()).indexOf(LINE_SEPARATOR);
            if (column < 0 || column > lineLength) return i + lineLength;  // No column or column out of bounds, take last column
            else return i + column;
        }
        if (String.valueOf(content.charAt(i)).equals(LINE_SEPARATOR)) currentLine++;
    }
    return -1;  // Should not happen
}

// Fast alternative to StringUtils.countMatches(getText().toString(), LINE_SEPARATOR) + 1
public int getTrueLineCount() {
    int count;
    String text = getText().toString();
    StringReader sr = new StringReader(text);
    LineNumberReader lnr = new LineNumberReader(sr);
    try {
        lnr.skip(Long.MAX_VALUE);
        count = lnr.getLineNumber() + 1;
    } catch (IOException e) {
        count = 0;  // Should not happen
    }
    sr.close();
    return count;
}

ตอบคำถามแล้ว แต่ฉันคิดว่ามีคนต้องการทำเช่นนั้นแทน

มันทำงานได้โดยวนลูปผ่านตัวละครแต่ละตัวเพิ่มจำนวนบรรทัดทุกครั้งที่พบตัวแยกบรรทัด เมื่อจำนวนบรรทัดเท่ากับบรรทัดที่ต้องการมันจะส่งกลับดัชนีปัจจุบัน + คอลัมน์หรือดัชนีสิ้นสุดบรรทัดหากคอลัมน์ไม่มีขอบเขต นอกจากนี้คุณยังสามารถนำมาใช้วิธีการก็จะส่งกลับนับบรรทัดละเว้นการวางรูปภาพกับข้อความซึ่งแตกต่างจากgetTrueLineCount()TextView.getLineCount()


0

ใน kotlin คุณสามารถสร้างฟังก์ชั่นเสริมดังนี้:

fun EditText.placeCursorAtLast() {
    val string = this.text.toString()
    this.setSelection(string.length)
}

แล้วก็โทร myEditText.placeCursorAtLast()


0

หากคุณต้องการตั้งตำแหน่งเคอร์เซอร์ใน EditText? ลองรหัสด้านล่างเหล่านี้

EditText rename;
 String title = "title_goes_here";
 int counts = (int) title.length();
 rename.setSelection(counts);
 rename.setText(title);

0

วิธีแก้ไขปัญหาตำแหน่งเคอร์เซอร์ซึ่งย้ายไปยังตำแหน่งสุดท้ายโดยอัตโนมัติหลังจากการจัดรูปแบบใน US Mobile เช่น (xxx) xxx-xxxx ใน Android

private String oldText = "";
private int lastCursor;
private EditText mEtPhone;

@Override
    public void afterTextChanged(Editable s) {
String cleanString = AppUtil.cleanPhone(s.toString());

String format = cleanString.length() < 11 ? cleanString.replaceFirst("(\\d{3})(\\d{3})(\\d+)", "($1) $2-$3") :
                cleanString.substring(0, 10).replaceFirst("(\\d{3})(\\d{3})(\\d+)", "($1) $2-$3");


boolean isDeleted = format.length() < oldText.length();

        try {

            int cur = AppUtil.getPointer(lastCursor, isDeleted ? s.toString() : format, oldText, isDeleted);
            mEtPhone.setSelection(cur > 0 ? cur : format.length());

        }catch (Exception e){
            e.printStackTrace();
            mEtPhone.setSelection(format.length());
        }

        mEtPhone.addTextChangedListener(this);

    }

    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {

        oldText = s.toString();
        lastCursor = start;
    }

กำหนดวิธีการด้านล่างให้กับ Activityclass ใด ๆ ในกรณีของฉันชื่อกิจกรรมคือ AppUtil และเข้าถึงได้ทั่วโลก

public static int getPointer(int index, String newString, String oldText, boolean isDeleted){

        int diff = Math.abs(newString.length() - oldText.length());

        return diff > 1 ? isDeleted ? index - diff : index  + diff : isDeleted ? index : index + 1;
    }

public static String cleanPhone(String phone){

        if(TextUtils.isEmpty(phone))
            return "";

        StringBuilder sb = new StringBuilder();
        for(char c : phone.toCharArray()){
            if(Character.isDigit(c))
                sb.append(c);
        }
        return sb.toString();
    }

และหากคุณต้องการกำหนดตำแหน่งเฉพาะใด ๆ

edittext.setSelection(position);

-3

ฉันเชื่อว่าวิธีที่ง่ายที่สุดในการทำเช่นนี้คือใช้การขยายตัว

พูดในส่วน edittext ของ xml เพิ่ม android: paddingLeft = "100dp" สิ่งนี้จะย้ายตำแหน่งเริ่มต้นของเคอร์เซอร์ 100dp จากด้านซ้ายสุด

เช่นเดียวกันคุณสามารถใช้ android: paddingRight = "100dp" สิ่งนี้จะย้ายตำแหน่งสิ้นสุดของเคอร์เซอร์ 100dp จากซ้ายไปขวา

สำหรับรายละเอียดเพิ่มเติมตรวจสอบบทความนี้ในบล็อกของฉัน : Android: การตั้งค่าเคอร์เซอร์เริ่มต้นและสิ้นสุดตำแหน่งใน EditText Widget


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