用户输入的实时编辑

9
是否可以在用户输入数据时自动将字符插入到EditText中?
例如,如果用户正在输入一个长数字,如123456789012,是否可以让这个数字在他输入它的同时出现在编辑文本框中,但每4个字符就有一个破折号?
因此,当您键入上面的数字时,您会看到它被输入到EditText框中,但是它看起来像这样:1234-5678-9012。
目前,我有一个应用程序,您可以输入一个长数字,然后按下一个按钮,它会为您插入破折号,但我想知道是否可以在输入时完成?
非常感谢任何帮助。

1
什么语言?什么平台?总的来说,这是可能的,但具体取决于语言和平台。 - Oded
在哪种技术中?例如,在网页、iPhone 应用程序等中。 - Zack Bloom
6个回答

15

通过标记android,我认为你正在讨论Android的editText,如果是这样,你可以通过监听TextChangedListener来实现。

编辑:针对退格键

editText.addTextChangedListener(new TextWatcher() {
            int len=0;
            @Override
            public void afterTextChanged(Editable s) { 
                String str = editText.getText().toString(); 
                 if(str.length()==4&& len <str.length()){//len check for backspace 
                    editText.append("-");
                }
            }

            @Override
            public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {

             String str = editText.getText().toString(); 
              len = str.length();
            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {  
            }


        }); 

1
请同时处理删除操作 - 给出的示例可能会使在输入4个字符后无法使用退格键(因为删除破折号将立即添加另一个破折号)。 - Nick
@Nick,我已经为退格键进行了编辑,所以这并不是不可能的。 - Labeeb Panampullan
1
@LabeebP 我已经尝试使用它了。但是如果我按退格键,- 不会被删除。而且一旦在 EditText 中预览了破折号,光标就会向前移动。 - Mr.G
这不会将破折号添加到我的EditText中。可能的原因是什么? - Figen Güngör
与@Figen Güngör为我所做的相同。 - josher932
显示剩余2条评论

7
为了解决这个问题,我编写了一个名为“AutoAddTextWatcher”的类:

1. 自动将文本插入到EditText中。
2. 将文本插入到您设置的位置处的EditText中。
3. 当文本长度大于1时,在EditText中删除您设置的位置处的文本。

enter image description here

代码片段:
mEditText_birthday.addTextChangedListener(new AutoAddTextWatcher(mEditText_birthday,
            "/",
            new TextWatcher() {},
            4, 6));

AutoAddTextWatcher类

import android.text.Editable;
import android.text.TextWatcher;
import android.widget.EditText;


/**
 * Created by henry.chuang on 2016/5/12.
 */
public class AutoAddTextWatcher implements TextWatcher {
    private CharSequence mBeforeTextChanged;
    private TextWatcher mTextWatcher;
    private int[] mArray_pos;
    private EditText mEditText;
    private String mAppentText;

    public AutoAddTextWatcher(EditText editText, String appendText, int... position){
        this.mEditText = editText;
        this.mAppentText = appendText;
        this.mArray_pos = position.clone();
    }
    public AutoAddTextWatcher(EditText editText, String appendText, TextWatcher textWatcher, int... position){
        this(editText, appendText, position);
        this.mTextWatcher = textWatcher;
    }

    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {
        mBeforeTextChanged = s.toString();

        if(mTextWatcher != null)
            mTextWatcher.beforeTextChanged(s, start, count, after);

    }

    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {
        for (int i = 0; i < mArray_pos.length; i++) {
            if(((mBeforeTextChanged.length() - mAppentText.length() * i) == (mArray_pos[i] - 1) &&
                    (s.length() - mAppentText.length() * i) == mArray_pos[i])){
                mEditText.append(mAppentText);

                break;
            }

            if(((mBeforeTextChanged.length() - mAppentText.length() * i) == mArray_pos[i] &&
                    (s.length() - mAppentText.length() * i) == (mArray_pos[i] + 1))){
                int idx_start = mArray_pos[i] + mAppentText.length() * i;
                int idx_end = Math.min(idx_start + mAppentText.length(), s.length());

                String sub = mEditText.getText().toString().substring(idx_start,  idx_end);

                if(!sub.equals(mAppentText)){
                    mEditText.getText().insert(s.length() - 1, mAppentText);
                }

                break;
            }

            if(mAppentText.length() > 1 &&
                    (mBeforeTextChanged.length() - mAppentText.length() * i) == (mArray_pos[i] + mAppentText.length()) &&
                    (s.length() - mAppentText.length() * i) == (mArray_pos[i] + mAppentText.length() - 1)){
                int idx_start = mArray_pos[i] + mAppentText.length() * i;
                int idx_end = Math.min(idx_start + mAppentText.length(), s.length());

                mEditText.getText().delete(idx_start, idx_end);

                break;
            }

        }

        if(mTextWatcher != null)
            mTextWatcher.onTextChanged(s, start, before, count);

    }

    @Override
    public void afterTextChanged(Editable s) {
        if(mTextWatcher != null)
            mTextWatcher.afterTextChanged(s);

    }

}

完整的演示源代码:
https://github.com/henrychuangtw/AutoInsertEditText


哇,伙计!你真是个天才!非常感谢你...我尝试了很多解决方案,但都没有正常工作。我需要将其格式化为12-345-67。其他任何解决方案在删除后重新输入时都会出现奇怪的问题。你的解决方案完美地解决了这个问题!但需要注意的一点是,为了使你的类正常工作,你需要在XML文件中设置输入类型为android:inputType="phone"。我最初尝试使用android:inputType="number",但它不起作用。我查看了你的github页面,并看到你使用了phone,现在它可以正常工作了。干得好! - Kevin Bright
这是我的实现代码:enterUserID.addTextChangedListener(new AutoAddTextWatcher(enterUserID, "-", 2, 5)); - Kevin Bright
@KevinBright 感谢您的鼓励和建议,我会尝试的。 - HenryChuang
不,谢谢!我简直不敢相信在Android上做这件事有多难! - Kevin Bright
@HenryChuang:是的,如果用户复制了文本并粘贴到编辑文本中。 - shyam.y
显示剩余3条评论

0

这是我使用的

private boolean mInEdit;

@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
    if (!mInEdit) {
        mInEdit = true;
        String delimiter = " - ";
        //Remove chars from your delimiter first
        String digits = s.toString().replaceAll("[- ]", "")
                .replaceAll("\\d{4}", "$0" + delimiter);
        //Handle deletion
        int dLength = delimiter.length();
        if (before > count && digits.endsWith(delimiter.charAt(dLength - 1)) {
            digits = digits.substring(0, digits.length() - dLength);
        }
        mCardNumber.setText(digits);
        mCardNumber.setSelection(mCardNumber.length());
        mInEdit = false;
    }
}

在这里,您可以用您想要分隔数字的符号来替换分隔符。


0

对于仍然遇到退格和多个连字符问题的人 -

new TextWatcher() 
{
        boolean hyphenExists;

        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
            if (s.length() >= 6 && s.charAt(5) == '-') {
                hyphenExists = true;
            } else {
                hyphenExists = false;
            }

            Log.d("TAG", "beforeTextChanged " + s.toString());
        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {

            Log.d("TAG", "onTextChanged " + s.toString());
        }

        @Override
        public void afterTextChanged(Editable s) {
            if (s.length() == 5) {
                if (!hyphenExists)
                    s.append('-');
            }
            Log.d("TAG", "afterTextChanged " + s.toString());
        }
    }

0
@Override
public void afterTextChanged(Editable s) {

    if(s.length() == 3 && len < s.length()){
        s.append(" - ");
    }

}

@Override
public void beforeTextChanged(CharSequence s, int start, int count,
        int after) {
    len = s.length();
}

这也可以,只是这段代码会在第三个字符后插入" - "


0

你可以通过“on text changed”来实现这一点。

在我的情况下,我必须将输入格式化为:xxx xxx-xxxx

我按照以下方式完成:

etMobileNumber.addTextChangedListener(object : TextWatcher {
        override fun afterTextChanged(s: Editable?) {


        }

        override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {
        }

        override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
            if (etMobileNumber.text.length == 3 && count != 0) {
                val text = etMobileNumber.getText().toString() + " "
                etMobileNumber.setText(text)
                etMobileNumber.setSelection(text.length)
            } else if (etMobileNumber.text.length == 7 && count != 0) {
                val text = etMobileNumber.getText().toString() + "-"
                etMobileNumber.setText(text)
                etMobileNumber.setSelection(text.length)
            }
        }
    })

而且在输入时,结果非常动态。

输入- 1234567890 结果- 123 456-7890


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