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?

nila
sumber
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)
NotACleverMan
sumber
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);
MKJParekh
sumber
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);
IntelliJ Amiya
sumber
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()

Reno
sumber
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
12

gunakan baris di bawah ini

e2.setSelection(e2.length());

e2 adalah edit Nama Objek teks

Syed Danish Haider
sumber
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.

monish george
sumber
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());
                }
            });
dev.sourabh
sumber
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().

Junior Damacena
sumber
5

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

Avinash
sumber
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);
calav3ra
sumber
3

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

 editText.requestFocus();
 editText.setSelection(editText.length());
Kailas Bhakade
sumber
2

Ingat panggilan requestFocus()sebelumnya setSelectionuntuk edittext.

Dong Thang
sumber
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);
sujith s
sumber
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>
                ^
Rasel
sumber
1
EditText editText = findViewById(R.id.editText);
editText.setSelection(editText.getText().length());
Satendra Behre
sumber
1
if(myEditText.isSelected){
    myEditText.setSelection(myEditText.length())
    }
MSilva
sumber
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().

Nicolas
sumber
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()

notdrone
sumber
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);
Mujahid Khan
sumber
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);
Jai Prakash
sumber
-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

Arthur Wang
sumber
2
Padding tidak ada hubungannya dengan posisi kursor, dan merupakan aliran pemikiran yang sepenuhnya salah dalam situasi khusus ini.
Shark