在编辑文本中,在光标位置插入字符。

10

我的代码是:

EditText edt
    
edt.addTextChangedListener(new TextWatcher() {
    
    @Override
    public void afterTextChanged(Editable arg0) {
    
        final String number = edt.getText().toString();
    
        int count = arg0.length();
        edt.setSelection(count);
    }
    
    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {
        // TODO Auto-generated method stub
    }
    
    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {
        final String number = edt.getText().toString();
    }
}

我也有一个拨号键盘。当我点击拨号键盘中的某个数字时,我需要将该数字添加到当前光标位置。另外,当我按删除键时,我需要从当前光标位置删除该数字。

拨号键盘图像

输入图像描述

7个回答

34

尝试以下代码

int start =editText.getSelectionStart(); //this is to get the the cursor position
String s = "Some string";
editText.getText().insert(start, s); //this will get the text and insert the String s into   the current position

以下是从EditText中删除选定文本的代码

int start = t1.getSelectionStart();  //getting cursor starting position
int end = t1.getSelectionEnd();      //getting cursor ending position
String selectedStr = t1.getText().toString().substring(start, end);    //getting the selected Text
t1.setText(t1.getText().toString().replace(selectedStr, ""));    //replacing the selected text with empty String and setting it to EditText

1
@Aju 实际上,删除部分是一种不可靠的方法,它并不总是有效。例如,如果你有这样的文本:“Hello Hello Hello”,而你只想删除中间的“Hello”,那么这种方法就行不通了。 - Srujan Barai

3

插入:

    String dialled_nos = dialpad_text.getText().toString();
    String number = view.getTag().toString(); // 1,2....9,0
    int start = dialpad_text.getSelectionStart(); 
    dialled_nos = new StringBuilder(dialled_nos).insert(start, number).toString();
    dialpad_text.setText(dialled_nos);
    dialpad_text.setSelection(start+1); // cursor will move to new position

删除:

    String dialled_nos = dialpad_text.getText().toString();
    int remove_index_position = dialpad_text.getSelectionStart()-1; 
    StringBuilder dialled_nos_builder = new StringBuilder(dialled_nos);
    if(remove_index_position>=0) {
        dialled_nos_builder.deleteCharAt(remove_index_position);
        dialpad_text.setText(dialled_nos_builder.toString()); 
        dialpad_text.setSelection(remove_index_position);
    }

谢谢。你的删除方法帮了我大忙! - Anurag Joshi
这应该是被接受的答案。它完美地运行。 - Aayush Thakur

1
你需要为你的按钮实现OnClickListener。在里面,你需要更新编辑器的文本。例如,对于“5”按钮:
public void onClick(View v) {

    String currentText = edt.getText();
    edt.setText(currentText + "5");
}

EditText类中,有getText()setText()函数。 - Caner

1
etPnr.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            etPnr.removeTextChangedListener(this);

            // TODO: If you want to do on the text, apply here

            if (start + count > etPnr.length())
                etPnr.setSelection(etPnr.length());
            else
                etPnr.setSelection(start + count);

            etPnr.addTextChangedListener(this);
        }

        @Override
        public void afterTextChanged(Editable s) {
        }
    });

你可以尝试一下。

1
对于 Kotlin:
editText.text.insert(editText.selectionStart, "Your Text Here")

1
editText.getText().insert(editText.getSelectionStart(), text);

文本是您要插入的实际字符串。


0

我目前使用这个解决方案:

public static void insertText(String text, EditText editText)
{
    int start = Math.max(editText.getSelectionStart(), 0);
    int end = Math.max(editText.getSelectionEnd(), 0);

    editText.getText().replace(Math.min(start, end), Math.max(start, end), text, 0, text.length());
    try
    {
        editText.setSelection(start + 1);
    }
    catch (final IndexOutOfBoundsException e)
    {

    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接