Bagaimana cara mengatur posisi kursor di EditText?


235

Ada dua EditText, saat memuat halaman teks diatur dalam EditText pertama, Jadi sekarang kursor akan berada di tempat awal EditText, saya ingin mengatur posisi kursor di EditText kedua yang tidak mengandung data. Bagaimana cara melakukannya?


2
Anda dapat mengatur gravitasinya menjadi 'center'.it akan secara otomatis mengatur kursor berada di tengah. teks Anda juga akan dipusatkan kemudian.
Hiral Vadodaria

pertama-tama, cobalah tingkatkan rasio penerimaan Anda. kedua, apa yang Anda maksud dengan mengatur posisi kursor, ketika tidak ada teks di edittext?
Vladimir

Jawaban:


483

Di mana posisi adalah int:

editText1.setSelection(position)

apakah ada cara untuk melakukan ini di file XML?
kike

@ sepertinya saya tidak berpikir begitu
atasoyh

1
gunakan android: selection in xml with binding data
Mubarak Mohideen

96

Saya telah melakukan cara ini untuk mengatur posisi kursor ke akhir teks setelah memperbarui teks dari EditText secara terprogram di sini, etmsgadalah EditText

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

4
+1 ah! Bagus itu membantu saya untuk mengatur posisi kursor di edittext.
Dharmendra

2
Ini tidak berhasil untuk saya. Saya memiliki string Spannable di EditText saya. Apakah ada solusi untuk itu?
toobsco42

1
@ toobsco42 Halo, Saya baru saja mencoba menggunakan Spannable String di edittext .. periksa pastebin.com/i02ZrNw4 ini dan berfungsi sebagaimana mestinya .. memeriksa dan membandingkan
MKJParekh

Bisakah ini dari File xml? @MKJParekh
Yog Guru

1
Tampaknya melakukan hal yang sama:etmsg.setText("my new text..."); etmsg.setSelection(etmsg.length());
Steve Blackwell

37

Bagaimana cara mengatur posisi kursor EditText di Android

Kode di bawah ini Setel kursor ke Mulai di EditText:

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

Di bawah Kode Set kursor untuk mengakhiri dari EditText:

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

Kode di bawah ini adalah Tetapkan kursor setelah beberapa posisi Karakter 2:

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

17

Saya ingin mengatur posisi kursor dalam edittext yang tidak mengandung data

Hanya ada satu posisi di EditText kosong, itu setSelection(0).

Atau apakah Anda maksudnya ingin fokus ke EditTextaktivitas Anda saat aktivitas dibuka? Dalam hal ini requestFocus()


setSelection (0) tidak berfungsi, saya tidak ingin mendapatkan fokus ke EditText kedua, saya hanya ingin mengatur kursor pada EditText kedua
nila

3
Jika saya ingat dengan benar, ketika EditText meminta fokus, kursor diatur. Baca ini
Reno


9

Biarkan editText2 adalah tampilan EditText kedua Anda. Lalu masukkan potongan kode berikut di onResume ()

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

atau dimasukkan

<requestFocus />

dalam tata letak xml Anda dari tampilan EditText kedua.


7

beberapa saat edit kursor teks donot datang pada posisi tertentu adalah jika kita langsung menggunakan editText.setSelection(position);. Dalam hal ini Anda dapat mencoba

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

7

Jika Anda ingin meletakkan kursor pada posisi tertentu pada EditText, Anda dapat menggunakan:

yourEditText.setSelection(position);

Selain itu, ada kemungkinan untuk mengatur posisi awal dan akhir, sehingga Anda secara terprogram memilih beberapa teks, dengan cara ini:

yourEditText.setSelection(startPosition, endPosition);

Harap perhatikan bahwa pengaturan pilihan mungkin rumit karena Anda dapat menempatkan kursor sebelum atau setelah karakter, gambar di bawah ini menjelaskan cara indeks berfungsi dalam kasus ini:

masukkan deskripsi gambar di sini

Jadi, jika Anda menginginkan kursor di akhir teks, cukup setel ke yourEditText.length().


5

setSelection(int index)Metode di Edittextharus memungkinkan Anda untuk melakukan ini.


4

sebagai pengingat: jika Anda menggunakan edittext.setSelection()untuk mengatur kursor, dan itu TIDAK berfungsi saat menyiapkan alertdialogmisalnya, pastikan untuk mengatur selection()SETELAH dialog telah dibuat

contoh:

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

3

Kode ini akan membantu Anda menampilkan kursor di posisi terakhir mengedit teks.

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

2

Ingat panggilan requestFocus()sebelumnya setSelectionuntuk edittext.


1

Saya tidak akan mendapatkan metode setSelection () secara langsung, jadi saya selesai seperti di bawah ini dan bekerja seperti pesona

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

Jika Anda ingin mengatur kursor setelah nkarakter dari kanan ke kiri maka Anda harus melakukan seperti ini.

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

Jika teks edittext suka

version<sub></sub>

dan Anda ingin memindahkan kursor di posisi ke-6 dari kanan

Maka itu akan memindahkan kursor di-

    version<sub> </sub>
                ^

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

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

0

Atur kursor ke baris dan kolom

Anda dapat menggunakan kode berikut untuk mendapatkan posisi di EditText Anda yang sesuai dengan baris dan kolom tertentu. Anda kemudian dapat menggunakan editText.setSelection(getIndexFromPos(row, column))untuk mengatur posisi kursor. Panggilan ke metode ini dapat dilakukan:

  • getIndexFromPos(x, y) Pergi ke kolom y dari baris x
  • getIndexFromPos(x, -1) Pergi ke kolom terakhir dari baris x
  • getIndexFromPos(-1, y) Pergi ke kolom y dari baris terakhir
  • getIndexFromPos(-1, -1) Pergi ke kolom terakhir dari baris terakhir

Semua batas baris dan kolom ditangani; Memasuki kolom yang lebih besar dari panjang garis akan mengembalikan posisi di kolom terakhir dari garis. Memasukkan baris yang lebih besar dari jumlah baris EditText akan menuju ke baris terakhir. Itu harus cukup andal karena sedang diuji berat.

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

Pertanyaannya sudah dijawab tetapi saya pikir seseorang bisa melakukan itu.

Ini bekerja dengan mengulangi setiap karakter, menambah jumlah baris setiap kali menemukan pemisah baris. Ketika jumlah baris sama dengan baris yang diinginkan, itu mengembalikan indeks saat ini + kolom, atau indeks akhir baris jika kolom di luar batas. Anda juga dapat menggunakan kembali getTrueLineCount()metode ini, ia mengembalikan jumlah baris mengabaikan pembungkus teks, tidak seperti TextView.getLineCount().


0

Di kotlin, Anda dapat membuat fungsi ekstensi seperti ini:

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

dan kemudian cukup menelepon myEditText.placeCursorAtLast()


0

Jika Anda ingin mengatur posisi kursor di EditText? coba kode di bawah ini

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

0

Cara mengatasi masalah posisi kursor yang secara otomatis pindah ke posisi terakhir setelah memformat di US Mobile seperti (xxx) xxx-xxxx di 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;
    }

Tetapkan metode di bawah ini untuk setiap kelas aktivitas dalam kasus saya. Nama aktivitas adalah AppUtil dan akses secara global

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

Dan jika Anda ingin mengatur posisi tertentu

edittext.setSelection(position);

-3

Saya percaya cara paling sederhana untuk melakukan ini hanya menggunakan bantalan.

Katakan di bagian edittext xml Anda, tambahkan android: paddingLeft = "100dp" Ini akan memindahkan posisi awal Anda dari kursor 100dp langsung dari ujung kiri.

Cara yang sama, Anda dapat menggunakan android: paddingRight = "100dp" Ini akan memindahkan posisi akhir Anda dari kursor 100dp ke kiri dari ujung kanan.

Untuk detail lebih lanjut, lihat artikel ini di blog saya : Android: Mengatur Kursor Memulai dan Mengakhiri Posisi di Widget EditText


2
Padding tidak ada hubungannya dengan posisi kursor, dan merupakan aliran pemikiran yang sepenuhnya salah dalam situasi khusus ini.
Shark
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.