มีสองEditText
ขณะที่โหลดหน้าข้อความตั้งอยู่ใน EditText แรกดังนั้นเคอร์เซอร์จะอยู่ที่ตำแหน่งเริ่มต้นEditText
ฉันต้องการตั้งตำแหน่งเคอร์เซอร์ใน EditText ที่สองซึ่งไม่มีข้อมูล ทำอย่างไร
มีสองEditText
ขณะที่โหลดหน้าข้อความตั้งอยู่ใน EditText แรกดังนั้นเคอร์เซอร์จะอยู่ที่ตำแหน่งเริ่มต้นEditText
ฉันต้องการตั้งตำแหน่งเคอร์เซอร์ใน EditText ที่สองซึ่งไม่มีข้อมูล ทำอย่างไร
คำตอบ:
ในกรณีที่ตำแหน่งเป็น int:
editText1.setSelection(position)
ฉันได้ทำวิธีนี้เพื่อตั้งตำแหน่งเคอร์เซอร์ไปที่จุดสิ้นสุดของข้อความหลังจากอัปเดตข้อความของ EditText โดยทางโปรแกรม
ที่นี่etmsg
คือ EditText
etmsg.setText("Updated Text From another Activity");
int position = etmsg.length();
Editable etext = etmsg.getText();
Selection.setSelection(etext, position);
etmsg.setText("my new text..."); etmsg.setSelection(etmsg.length());
ด้านล่างรหัสคือตั้งค่าเคอร์เซอร์เป็นเริ่มต้นใน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);
ฉันต้องการตั้งตำแหน่งเคอร์เซอร์ใน edittext ซึ่งไม่มีข้อมูล
มีตำแหน่งเดียวใน EditText ที่ว่างเปล่าsetSelection(0)
เท่านั้น
หรือคุณหมายถึงคุณต้องการให้ความสำคัญกับEditText
กิจกรรมของคุณเมื่อเปิด? ในกรณีนั้น requestFocus()
ใช้บรรทัดด้านล่าง
e2.setSelection(e2.length());
e2
แก้ไขข้อความชื่อวัตถุ
ให้ editText2 เป็นมุมมอง EditText ที่สองของคุณจากนั้นใส่โค้ดต่อไปนี้ในonResume ()
editText2.setFocusableInTouchMode(true);
editText2.requestFocus();
หรือใส่
<requestFocus />
ในเค้าโครง xml ของคุณในมุมมอง EditText ที่สอง
บางเวลาแก้ไข donot editText.setSelection(position);
เคอร์เซอร์ข้อความมาที่ตำแหน่งโดยเฉพาะอย่างยิ่งถ้าเราใช้โดยตรง ในกรณีนี้คุณสามารถลอง
editText.post(new Runnable() {
@Override
public void run() {
editText.setSelection(string.length());
}
});
หากคุณต้องการวางเคอร์เซอร์ในตำแหน่งที่แน่นอนบน EditText คุณสามารถใช้:
yourEditText.setSelection(position);
นอกจากนี้ยังมีความเป็นไปได้ในการตั้งค่าตำแหน่งเริ่มต้นและสุดท้ายเพื่อให้คุณเลือกข้อความบางส่วนด้วยวิธีนี้:
yourEditText.setSelection(startPosition, endPosition);
โปรดทราบว่าการตั้งค่าการเลือกอาจมีความยุ่งยากเนื่องจากคุณสามารถวางเคอร์เซอร์ไว้ก่อนหรือหลังตัวอักษรภาพด้านล่างอธิบายถึงวิธีการจัดทำดัชนีในกรณีนี้:
yourEditText.length()
ดังนั้นถ้าคุณต้องการเคอร์เซอร์ในตอนท้ายของข้อความเพียงตั้งค่าให้
setSelection(int index)
วิธีการในEdittext
ควรอนุญาตให้คุณทำเช่นนี้
เพื่อเป็นการเตือน: หากคุณใช้edittext.setSelection()
เพื่อตั้งค่าเคอร์เซอร์และมันไม่ทำงานในขณะที่ตั้งค่าalertdialog
ตัวอย่างตรวจสอบให้แน่ใจว่าได้ตั้งค่าselection()
หลังจากที่กล่องโต้ตอบถูกสร้างขึ้นแล้ว
ตัวอย่าง:
AlertDialog dialog = builder.show();
input.setSelection(x,y);
รหัสนี้จะช่วยให้คุณแสดงเคอร์เซอร์ที่ตำแหน่งสุดท้ายของการแก้ไขข้อความ
editText.requestFocus();
editText.setSelection(editText.length());
โปรดจำไว้ว่าโทรrequestFocus()
มาก่อนsetSelection
เพื่อ edittext
ฉันจะไม่รับเมธอด 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);
หากคุณต้องการตั้งค่าเคอร์เซอร์หลังn
ตัวละครจากขวาไปซ้ายคุณต้องทำเช่นนี้
edittext.setSelection(edittext.length()-n);
หากข้อความของ edittext เป็นเช่นนั้น
version<sub></sub>
และคุณต้องการเลื่อนเคอร์เซอร์ไปที่ตำแหน่งที่ 6 จากด้านขวา
จากนั้นมันจะเลื่อนเคอร์เซอร์ไปที่ -
version<sub> </sub>
^
EditText editText = findViewById(R.id.editText);
editText.setSelection(editText.getText().length());
if(myEditText.isSelected){
myEditText.setSelection(myEditText.length())
}
คุณสามารถใช้รหัสต่อไปนี้เพื่อรับตำแหน่งใน EditText ของคุณที่สอดคล้องกับแถวและคอลัมน์ที่แน่นอน จากนั้นคุณสามารถใช้editText.setSelection(getIndexFromPos(row, column))
เพื่อตั้งตำแหน่งเคอร์เซอร์ การเรียกใช้เมธอดต่อไปนี้สามารถทำได้:
getIndexFromPos(x, y)
ไปที่คอลัมน์ y ของบรรทัด xgetIndexFromPos(x, -1)
ไปที่คอลัมน์สุดท้ายของบรรทัด xgetIndexFromPos(-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()
ใน kotlin คุณสามารถสร้างฟังก์ชั่นเสริมดังนี้:
fun EditText.placeCursorAtLast() {
val string = this.text.toString()
this.setSelection(string.length)
}
แล้วก็โทร myEditText.placeCursorAtLast()
หากคุณต้องการตั้งตำแหน่งเคอร์เซอร์ใน EditText? ลองรหัสด้านล่างเหล่านี้
EditText rename;
String title = "title_goes_here";
int counts = (int) title.length();
rename.setSelection(counts);
rename.setText(title);
วิธีแก้ไขปัญหาตำแหน่งเคอร์เซอร์ซึ่งย้ายไปยังตำแหน่งสุดท้ายโดยอัตโนมัติหลังจากการจัดรูปแบบใน 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);
ฉันเชื่อว่าวิธีที่ง่ายที่สุดในการทำเช่นนี้คือใช้การขยายตัว
พูดในส่วน edittext ของ xml เพิ่ม android: paddingLeft = "100dp" สิ่งนี้จะย้ายตำแหน่งเริ่มต้นของเคอร์เซอร์ 100dp จากด้านซ้ายสุด
เช่นเดียวกันคุณสามารถใช้ android: paddingRight = "100dp" สิ่งนี้จะย้ายตำแหน่งสิ้นสุดของเคอร์เซอร์ 100dp จากซ้ายไปขวา
สำหรับรายละเอียดเพิ่มเติมตรวจสอบบทความนี้ในบล็อกของฉัน : Android: การตั้งค่าเคอร์เซอร์เริ่มต้นและสิ้นสุดตำแหน่งใน EditText Widget