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