EditText'te imleç konumu nasıl ayarlanır?


235

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


2
yerçekimini 'center' olarak ayarlayabilirsiniz. imleci otomatik olarak merkezde olacak şekilde ayarlar. metniniz de ortalanır.
Hiral Vadodaria

her şeyden önce, kabul oranınızı artırmayı deneyin. ikincisi, edittext'de metin olmadığında imleç konumunu ayarlayarak ne demek istiyorsun?
Vladimir

Yanıtlar:



96

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

4
+1 ah! Güzel oldu imleç konumunu düzenleme metninde ayarlamama yardımcı oldu.
Dharmendra

2
Bu benim için işe yaramadı. Benim EditText içinde Spannable dizeleri var. Bunun için bir çözüm var mı?
toobsco42

1
@ toobsco42 Merhaba, ben sadece edittext Spannable Dize kullanmaya çalıştım .. Bu pastebin.com/i02ZrNw4 kontrol ve olması gerektiği gibi çalışıyor .. kontrol edin ve karşılaştırın
MKJParekh

Bu xml dosyasından mümkün mü? @MKJParekh
Yog Guru

1
Aynı şeyi yapıyor:etmsg.setText("my new text..."); etmsg.setSelection(etmsg.length());
Steve Blackwell

37

Android'de EditText İmleç konumunu ayarlama

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

17

Veri içermeyen düzenleme metninde imleç konumunu ayarlamak istiyorum

Boş bir EditText'te sadece bir konum vardır, öyle setSelection(0).

Yoksa EditTextetkinliğiniz açıldığında size odaklanmak istediğiniz mi demek istediniz ? Bu durumda requestFocus()


setSelection (0) çalışmıyor, ikinci EditText'e odaklanmak istemiyorum, sadece imleci ikinci EditText'te ayarlamak istiyorum
nila

3
Doğru hatırlıyorsam, bir EditText odak istendiğinde, imleç ayarlanır. Bunu okuyun
Reno


9

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.


7

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

7

İ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:

resim açıklamasını buraya girin

Dolayısıyla, imlecin metnin sonunda olmasını istiyorsanız, sadece olarak ayarlayın yourEditText.length().


5

setSelection(int index)yönteminin Edittextbunu yapmanıza izin vermesi gerekir.


4

hatırlatma olarak: edittext.setSelection()imleci ayarlamak için kullanıyorsanız ve alertdialogörneğin kurulumu sırasında ÇALIŞMIYORSA selection(), iletişim kutusu oluşturulduktan SONRA ayarladığınızdan emin olun.

misal:

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

3

Bu kod, imlecinizi metin düzenlemenin son konumunda göstermenize yardımcı olacaktır.

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

2

Aramayı hatırla requestFocus()önce setSelectionEDITTEXT için.


1

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

1

İmleci nkarakterden sonra sağdan sola ayarlamak istiyorsanız, bunu yapmanız gerekir.

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

Düzenleme metninin metni

version<sub></sub>

ve imleci sağdan 6. konuma taşımak istiyorsunuz

Sonra imleci hareket ettirir-

    version<sub> </sub>
                ^

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

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

0

İmleci bir satıra ve sütuna ayarla

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 git
  • getIndexFromPos(x, -1) X satırının son sütununa git
  • getIndexFromPos(-1, y) Son satırın y sütununa git
  • getIndexFromPos(-1, -1) Son satırın son sütununa git

Tü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().


0

Kotlin'de şöyle bir uzantı işlevi oluşturabilirsiniz:

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

ve sonra ara myEditText.placeCursorAtLast()


0

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

0

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

-3

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ı


2
Dolgunun imleç konumu ile ilgisi yoktur ve bu özel durumda tamamen yanlış bir düşünce okuludur.
Köpekbalığı
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.