İki tane var EditText
, bir metin ilk EditText'te ayarlanan sayfayı yüklerken, şimdi imlecin başlangıç yerinde olacağı , ikinci EditText'te veri içermeyen imleç konumunu ayarlamakEditText
istiyorum . Bu nasıl yapılır?
İki tane var EditText
, bir metin ilk EditText'te ayarlanan sayfayı yüklerken, şimdi imlecin başlangıç yerinde olacağı , ikinci EditText'te veri içermeyen imleç konumunu ayarlamakEditText
istiyorum . Bu nasıl yapılır?
Yanıtlar:
Konum bir int olduğunda:
editText1.setSelection(position)
EditText metnini programatik olarak
burada güncelledikten sonra imlecin konumunu metnin sonuna ayarlamak için bu şekilde yaptım 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());
Kod Aşağıda ise Başlama ayarı İmleç içinde EditText
:
EditText editText = (EditText)findViewById(R.id.edittext_id);
editText.setSelection(0);
Kod Aşağıda ise sonuna kadar ayarı İmleç arasında EditText
:
EditText editText = (EditText)findViewById(R.id.edittext_id);
editText.setSelection(editText.getText().length());
Aşağıda Kod, bazı 2.Karakter konumundan sonra ayarlanır:
EditText editText = (EditText)findViewById(R.id.edittext_id);
editText.setSelection(2);
Veri içermeyen düzenleme metninde imleç konumunu ayarlamak istiyorum
Boş bir EditText'te sadece bir konum vardır, öyle setSelection(0)
.
Yoksa EditText
etkinliğiniz açıldığında size odaklanmak istediğiniz mi demek istediniz ? Bu durumda requestFocus()
aşağıdaki satırı kullan
e2.setSelection(e2.length());
e2
metin düzenleme Nesne Adı
EditText2, ikinci EditText görünümünüz olsun. OnResume () öğesine aşağıdaki kod parçasını ekleyin
editText2.setFocusableInTouchMode(true);
editText2.requestFocus();
veya koy
<requestFocus />
ikinci EditText görünümünün xml düzeninizde.
bir süre düzenleme metin imleci bağışta bulunan belirli bir konuma gelirse doğrudan kullanırız editText.setSelection(position);
. Bu durumda deneyebilirsiniz
editText.post(new Runnable() {
@Override
public void run() {
editText.setSelection(string.length());
}
});
İmleci bir EditText üzerinde belirli bir konuma yerleştirmek istiyorsanız, şunları kullanabilirsiniz:
yourEditText.setSelection(position);
Ayrıca, başlangıç ve son konumu ayarlama imkanı vardır, böylece programlı olarak bazı metinleri bu şekilde seçersiniz:
yourEditText.setSelection(startPosition, endPosition);
Eğer imleci çünkü seçim ayarı zor olabileceğini not edin önce veya sonra bir karakter, görüntü altında nasıl bu durumda endeks çalışmalarına açıklıyor:
Dolayısıyla, imlecin metnin sonunda olmasını istiyorsanız, sadece olarak ayarlayın yourEditText.length()
.
Bu kod, imlecinizi metin düzenlemenin son konumunda göstermenize yardımcı olacaktır.
editText.requestFocus();
editText.setSelection(editText.length());
Aramayı hatırla requestFocus()
önce setSelection
EDITTEXT için.
SetSelection () yöntemini doğrudan alamayacağım, bu yüzden aşağıdaki gibi yaptım ve çekicilik gibi çalışıyorum
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);
EditText editText = findViewById(R.id.editText);
editText.setSelection(editText.getText().length());
EditText'inizde belirli bir satıra ve sütuna karşılık gelen konumu almak için aşağıdaki kodu kullanabilirsiniz. Daha sonra editText.setSelection(getIndexFromPos(row, column))
imleç konumunu ayarlamak için kullanabilirsiniz . Yönteme aşağıdaki çağrılar yapılabilir:
getIndexFromPos(x, y)
X satırının y sütununa gitgetIndexFromPos(x, -1)
X satırının son sütununa gitgetIndexFromPos(-1, y)
Son satırın y sütununa gitgetIndexFromPos(-1, -1)
Son satırın son sütununa gitTüm çizgi ve sütun sınırları işlenir; Satır uzunluğundan daha büyük bir sütun girildiğinde, satırın son sütununda konum döndürülür. EditText satır sayısından daha büyük bir satır girmek son satıra gider. Ağır test edildiğinden yeterince güvenilir olmalıdır.
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;
}
Soru zaten cevaplanmıştı ama bunun yerine birisinin bunu yapmak isteyebileceğini düşündüm.
Her karakter arasında döngü yaparak, her satır ayırıcı bulduğunda satır sayısını artırarak çalışır. Satır sayısı istenen satıra eşit olduğunda, geçerli dizini + sütunu veya sütun sınırların dışındaysa satır sonu dizinini döndürür. Ayrıca getTrueLineCount()
yöntemi yeniden kullanabilirsiniz , aksine, metin kaydırmayı yok sayan bir satır sayısı döndürür TextView.getLineCount()
.
EditText'te imleç konumunu ayarlamak isterseniz? Aşağıdaki kodu deneyin
EditText rename;
String title = "title_goes_here";
int counts = (int) title.length();
rename.setSelection(counts);
rename.setText(title);
Android'de (xxx) xxx-xxxx gibi US Mobile'da biçimlendirdikten sonra otomatik olarak son konuma hareket eden imleç konumu sorunu nasıl çözülür.
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;
}
Benim durumumda herhangi bir Activityclass için aşağıdaki yöntemi tanımlayın Etkinlik adı AppUtil ve küresel olarak erişin
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();
}
Ve belirli bir konum ayarlamak istiyorsanız
edittext.setSelection(position);
Bunu yapmanın en basit yolunun sadece dolgu kullanmak olduğuna inanıyorum.
Xml'nizin edittext bölümünde söyleyin, android ekleyin: paddingLeft = "100dp" Bu, 100dp imlecin başlangıç konumunuzu sol uçtan sağa hareket ettirecektir.
Aynı şekilde, android kullanabilirsiniz: paddingRight = "100dp" Bu, 100dp imlecinin bitiş konumunu sağ uçtan sola hareket ettirir.
Daha fazla ayrıntı için bu makaleye blogumda : Android: Başlatma ve EditText Widget Konumunu Bitiş İmleç Ayarı