Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 用户输入的实时编辑_Android_String_Android Edittext - Fatal编程技术网

Android 用户输入的实时编辑

Android 用户输入的实时编辑,android,string,android-edittext,Android,String,Android Edittext,当用户输入数据时,是否可以在编辑文本中自动插入字符 也就是说,如果用户正在输入一个长的数字,例如123456789012,那么当用户在编辑文本框中键入该数字时,是否可能出现该数字,但每四个字符会出现一个破折号 因此,当您在上面键入数字时,您会看到它被输入到EditText框中,但看起来是这样的:1234-5678-9012 目前我有一个应用程序,你可以输入一个长的数字,然后按下一个按钮,它会为你插入破折号,但我很好奇,它是否可以像你键入的那样完成 非常感谢您的帮助。通过标记android,我认为

当用户输入数据时,是否可以在编辑文本中自动插入字符

也就是说,如果用户正在输入一个长的数字,例如
123456789012
,那么当用户在编辑文本框中键入该数字时,是否可能出现该数字,但每四个字符会出现一个破折号

因此,当您在上面键入数字时,您会看到它被输入到
EditText
框中,但看起来是这样的:1234-5678-9012

目前我有一个应用程序,你可以输入一个长的数字,然后按下一个按钮,它会为你插入破折号,但我很好奇,它是否可以像你键入的那样完成


非常感谢您的帮助。

通过标记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) {  
            }


        }); 
editText.addTextChangedListener(新的TextWatcher(){
int len=0;
@凌驾
公共无效后文本更改(可编辑的s){
String str=editText.getText().toString();
如果(str.length()==4&&len
@覆盖
公共无效后文本已更改(可编辑){
如果(s.length()==3&&len
这也可以,只有这段代码会在第三个字符后插入
“-”

这就是我使用的

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

在这里,您可以将分隔符替换为要分隔的数字。

对于那些仍然面临退格和多个连字符问题的人-

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

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

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

代码段:

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

    }

}
导入android.text.Editable;
导入android.text.TextWatcher;
导入android.widget.EditText;
/**
*由henry.chuang于2016年5月12日创建。
*/
公共类AutoAddTextWatcher实现TextWatcher{
私有字符序列mBeforeTextChanged;
私有TextWatcher mTextWatcher;
私人国际[]马里尤酒店;
私有EditText-mEditText;
私有字符串映射文本;
公共AutoAddTextWatcher(EditText、字符串appendText、int…位置){
this.mEditText=编辑文本;
this.mappentext=appendText;
this.mArray_pos=position.clone();
}
公共AutoAddTextWatcher(EditText、String appendText、TextWatcher TextWatcher、int…位置){
此(编辑文本、附录文本、位置);
this.mTextWatcher=textWatcher;
}
@凌驾
更改前文本之前的公共void(字符序列s、int start、int count、int after){
mBeforeTextChanged=s.toString();
if(mTextWatcher!=null)
mTextWatcher.beforeTextChanged(s、start、count、after);
}
@凌驾
public void onTextChanged(字符序列、int start、int before、int count){
对于(int i=0;i1&&
(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\u开始,idx\u结束);
打破
}
}
if(mTextWatcher!=null)
mTextWatcher.onTextChanged(s,开始,之前,计数);
}
@凌驾
公共无效后文本已更改(可编辑){
if(mTextWatcher!=null)
mTextWatcher.PostextChanged(s);
}
}
完整的演示源:

您可以通过更改文本来实现这一点

在我的例子中,我必须像这样格式化输入: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

什么语言?什么平台?一般来说,这是可能的,但细节取决于语言和平台。采用什么技术?例如网页、iPhone应用程序等。太好了。非常感谢你的回答。还要处理删除操作-给出的示例可能会使键入4个字符后无法退格(因为删除破折号会立即添加另一个破折号).@Nick,我已将其编辑为backspace,所以不是impossible@LabeebP我尝试过使用它。但是如果我按back space。-也不会删除。而且一旦edittext中的破折号预览,光标将被移动到前进中。这不会在我的edittext中添加破折号。原因可能是什么?哇,老兄!你真是个天才!非常感谢你…我我已经尝试了很多解决方案,但都没有成功。我需要将其格式化为以下格式:1
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)
            }
        }
    })