Jak ustawić pozycję kursora w EditText?


235

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ć?


2
możesz ustawić jego grawitację na „środek”. to automatycznie ustawi kursor na środku. twój tekst również byłby wówczas wyśrodkowany.
Hiral Vadodaria

przede wszystkim spróbuj poprawić swój współczynnik akceptacji. po drugie, co rozumiesz przez ustawienie pozycji kursora, gdy nie ma tekstu w edycji tekstu?
Vladimir

Odpowiedzi:



96

Zrobiłem w ten sposób, aby ustawić pozycję kursora na końcu tekstu po programowej aktualizacji tekstu EditText tutaj, etmsgto EditText

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

4
+1 ah! Fajnie, pomogło mi to ustawić pozycję kursora w edytorze tekstu.
Dharmendra,

2
To nie działało dla mnie. Mam ciągi Spannable w moim EditText. Czy można to obejść?
toobsco42

1
@ toobsco42 Witam, właśnie próbowałem użyć Spannable String w edittext .. sprawdź to pastebin.com/i02ZrNw4 i działa zgodnie z oczekiwaniami .. sprawdź i porównaj
MKJParekh 31.12.12

Czy jest to możliwe z pliku XML? @MKJParekh
Yog Guru

1
Wydaje się, że robi to samo:etmsg.setText("my new text..."); etmsg.setSelection(etmsg.length());
Steve Blackwell

37

Jak ustawić pozycję kursora EditText w systemie Android

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);

17

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, EditTextkiedy zaczyna się twoja aktywność? W takim przypadku jest to requestFocus()


setSelection (0) nie działa, nie chcę skupiać się na drugim EditText, chcę tylko ustawić kursor w drugim
EditText

3
Jeśli dobrze pamiętam, kiedy FocusText żąda skupienia, kursor jest ustawiony. Przeczytaj to
Reno,


9

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.


7

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());
                }
            });

7

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:

wprowadź opis zdjęcia tutaj

Jeśli więc chcesz kursor na końcu tekstu, po prostu ustaw go na yourEditText.length().


5

setSelection(int index)Metoda in Edittextpowinna pozwolić ci to zrobić.


4

dla przypomnienia: jeśli używasz edittext.setSelection()do ustawiania kursora i NIE działa on podczas konfigurowania alertdialogna przykład, upewnij się, że ustawiłeś selection()PO utworzeniu okna dialogowego

przykład:

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

3

Ten kod pomoże ci pokazać kursor na ostatniej pozycji edycji tekstu.

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

2

Pamiętaj, zadzwoń requestFocus()wcześniej, setSelectionaby edytować tekst.


1

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);

1

Jeśli chcesz ustawić kursor po nznaku od prawej do lewej, musisz to zrobić w ten sposób.

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

Jeśli tekst edittext lubi

version<sub></sub>

i chcesz przesunąć kursor na 6. pozycji z prawej

Następnie przesunie kursor w

    version<sub> </sub>
                ^

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

1
if(myEditText.isSelected){
    myEditText.setSelection(myEditText.length())
    }

0

Ustaw kursor na wiersz i kolumnę

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 x
  • getIndexFromPos(x, -1) Przejdź do ostatniej kolumny linii x
  • getIndexFromPos(-1, y) Przejdź do kolumny y ostatniego wiersza
  • getIndexFromPos(-1, -1) Przejdź do ostatniej kolumny ostatniego wiersza

Obsł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().


0

W kotlin możesz utworzyć funkcję rozszerzenia taką jak ta:

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

a następnie po prostu zadzwoń myEditText.placeCursorAtLast()


0

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);

0

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);

-3

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


2
Padding nie ma nic wspólnego z pozycją kursora i jest całkowicie błędną szkołą myślenia w tej konkretnej sytuacji.
Shark
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.