Są dwa EditText
, podczas ładowania strony tekst jest ustawiany w pierwszym EditText, więc teraz kursor będzie w miejscu początkowym EditText
, chcę ustawić pozycję kursora w drugim EditText, który nie zawiera danych. Jak to zrobić?
Są dwa EditText
, podczas ładowania strony tekst jest ustawiany w pierwszym EditText, więc teraz kursor będzie w miejscu początkowym EditText
, chcę ustawić pozycję kursora w drugim EditText, który nie zawiera danych. Jak to zrobić?
Odpowiedzi:
Zrobiłem w ten sposób, aby ustawić pozycję kursora na końcu tekstu po programowej aktualizacji tekstu EditText
tutaj, etmsg
to 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());
Poniżej kodu ustaw kursor na Rozpocznij za EditText
:
EditText editText = (EditText)findViewById(R.id.edittext_id);
editText.setSelection(0);
Poniższy kod jest Ustaw kursor do końca z EditText
:
EditText editText = (EditText)findViewById(R.id.edittext_id);
editText.setSelection(editText.getText().length());
Kursor pod kodem jest ustawiony po pozycji 2 znaku:
EditText editText = (EditText)findViewById(R.id.edittext_id);
editText.setSelection(2);
Chcę ustawić pozycję kursora w edytorze tekstu, który nie zawiera danych
Jest tylko jedna pozycja w pustym EditText, to jest setSelection(0)
.
Czy miałeś na myśli, że chcesz skupić się na tym, EditText
kiedy zaczyna się twoja aktywność? W takim przypadku jest to requestFocus()
użyj poniższej linii
e2.setSelection(e2.length());
e2
edytuj tekst Nazwa obiektu
Niech editText2 to twój drugi widok EditText. Następnie umieść następujący fragment kodu w onResume ()
editText2.setFocusableInTouchMode(true);
editText2.requestFocus();
lub umieścić
<requestFocus />
w układzie xml drugiego widoku EditText.
jakiś czas edycji tekstu kursor donot przychodzi w konkretnej pozycji, jeśli używamy bezpośrednio editText.setSelection(position);
. W takim przypadku możesz spróbować
editText.post(new Runnable() {
@Override
public void run() {
editText.setSelection(string.length());
}
});
Jeśli chcesz umieścić kursor w określonej pozycji na EditText, możesz użyć:
yourEditText.setSelection(position);
Dodatkowo istnieje możliwość ustawienia początkowej i końcowej pozycji, aby programowo zaznaczyć tekst w następujący sposób:
yourEditText.setSelection(startPosition, endPosition);
Pamiętaj, że ustawienie zaznaczenia może być trudne, ponieważ możesz umieścić kursor przed znakiem lub po nim, poniższy rysunek wyjaśnia, w jaki sposób działa indeksowanie w tym przypadku:
Jeśli więc chcesz kursor na końcu tekstu, po prostu ustaw go na yourEditText.length()
.
Ten kod pomoże ci pokazać kursor na ostatniej pozycji edycji tekstu.
editText.requestFocus();
editText.setSelection(editText.length());
Pamiętaj, zadzwoń requestFocus()
wcześniej, setSelection
aby edytować tekst.
Nie otrzymam bezpośrednio metody setSelection (), więc zrobiłem jak poniżej i działam jak urok
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());
Możesz użyć następującego kodu, aby uzyskać pozycję w swoim EditText, która odpowiada pewnemu wierszowi i kolumnie. Następnie można użyć editText.setSelection(getIndexFromPos(row, column))
do ustawienia pozycji kursora. Można wykonać następujące wywołania metody:
getIndexFromPos(x, y)
Przejdź do kolumny y wiersza xgetIndexFromPos(x, -1)
Przejdź do ostatniej kolumny linii xgetIndexFromPos(-1, y)
Przejdź do kolumny y ostatniego wierszagetIndexFromPos(-1, -1)
Przejdź do ostatniej kolumny ostatniego wierszaObsługiwane są wszystkie granice wierszy i kolumn; Wprowadzenie kolumny większej niż długość linii spowoduje zwrócenie pozycji w ostatniej kolumnie linii. Wprowadzenie wiersza większego niż liczba wierszy EditText spowoduje przejście do ostatniego wiersza. Powinien być wystarczająco niezawodny, ponieważ został mocno przetestowany.
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;
}
Odpowiedź na to pytanie była już udzielona, ale myślałem, że ktoś może chcieć to zrobić zamiast tego.
Działa poprzez zapętlanie każdego znaku, zwiększając liczbę linii za każdym razem, gdy znajdzie separator linii. Gdy liczba wierszy jest równa żądanej linii, zwraca bieżący indeks + kolumnę lub indeks końca linii, jeśli kolumna jest poza zakresem. Możesz również ponownie użyć tej getTrueLineCount()
metody, w przeciwieństwie do liczenia wierszy, ignorując zawijanie tekstu TextView.getLineCount()
.
Jeśli chcesz ustawić pozycję kursora w EditText? spróbuj tych poniżej kodu
EditText rename;
String title = "title_goes_here";
int counts = (int) title.length();
rename.setSelection(counts);
rename.setText(title);
Jak rozwiązać problem z pozycją kursora, który automatycznie przesuwa się do ostatniej pozycji po sformatowaniu w usłudze US Mobile, takiej jak (xxx) xxx-xxxx w Androidzie.
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;
}
Zdefiniuj poniższą metodę dla dowolnej Activityclass w moim przypadku Nazwa działania to AppUtil i uzyskaj do niej dostęp globalnie
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();
}
A jeśli chcesz ustawić dowolną konkretną pozycję
edittext.setSelection(position);
Uważam, że najprostszym sposobem na to jest po prostu wypełnienie.
Powiedz w sekcji edycyjnej xml, dodaj androida: paddingLeft = "100dp" Spowoduje to przesunięcie pozycji początkowej kursora 100dp w prawo od lewego końca.
W ten sam sposób możesz użyć Androida: paddingRight = "100dp" Spowoduje to przesunięcie pozycji końcowej kursora o 100dp w lewo od prawego końca.
Aby uzyskać więcej informacji, sprawdź ten artykuł na moim blogu : Android: Ustawianie pozycji początkowej i końcowej kursora w widżecie EditText