如果用户开始输入文本,如何在edittext开头自动添加文本。例如,我想在用户开始输入电话号码时自动附加国家/地区代码。 我试过了 -
mNumber.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void afterTextChanged(Editable editable) {
mNumber.setText("+91"+editable.getText().toString());
}
});
但这不起作用,我输入edittext时我的设备就会挂起。
答案 0 :(得分:4)
您导致无限循环,因为您从setText()
呼叫afterTextChanged()
,然后setText()
正在呼叫afterTextChanged()
,依此类推。依此类推。
您可以将afterTextChanged()
更改为以下内容,
public void afterTextChanged(Editable s) {
if(!s.toString().startsWith("+91")){
s.insert(0, "+91");
}
}
这样你就不会一直调用setText()
,而且每次用户在EditText中键入内容时都会检查是否存在“+91”。这种方法的一个缺点是,一旦在输入开始时自动插入了退格键,就无法删除“+91”。
答案 1 :(得分:2)
你的应用程序挂起,因为mNumber.setText("...")
再次触发你的addTextChangedListener(),又一次又一次......
您可以通过检查前缀是否已经设置来避免这种情况,如果不是前缀,则只需添加前缀。
public void afterTextChanged(Editable editable) {
if (!mNumber.getText().startsWith("+91")) {
mNumber.setText("+91"+mNumber.getText());
}
}
答案 2 :(得分:1)
改善@ wanpanman的回答
ET.addTextChangedListener(new TextWatcher() {
int count;
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
count=i2;
}
@Override
public void afterTextChanged(Editable s) {
if(!s.toString().startsWith("+91 ") && count!=0){
s.insert(0, "+91 ");
}
}
});
count变量确保在删除+91的第一个实例时+91不会被添加两次。
当count = 0时,表示退格。