我在考虑下面给出的逻辑
editTextUserName.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) {
}
@Override
public void afterTextChanged(Editable s) {
appendEmail(editTextUserName.getText().toString());
}
});
void appendEmail(String email){
if( email.length()>=1){
editTextUserName.setText("@gmail.com");
}
}
这是示例代码而不是实际代码。这引发了stackoverflow异常。
任何人都可以解决isssue
答案 0 :(得分:2)
您需要检查子串" @ gmail.com"已经存在,不需要再次setText。因为当你将文本设置为EditText时,它再次调用afterTextChange,然后你调用appendEmail,然后再次设置文本等。
void appendEmail(String email){
if(!TextUtils.isEmpty(email) && email.contains("@gmail.com")){
editTextUserName.setText(email + "@gmail.com");
}
答案 1 :(得分:2)
我认为TextWatcher
在这里不合适(如 m vai 所评论)。
在EditText标记中执行添加android:imeOptions="actionDone"
editText.setOnEditorActionListener(new EditText.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
if (actionId == EditorInfo.IME_ACTION_DONE) {
editText.setText(editText.getText().toString()+"@gmail.com");
}
return false;
}
});
答案 2 :(得分:0)
没有测试,但我担心在你输入的每个字母后调用afterTextChanged()
。如果是这种情况,你应该尝试其他回调,比如失去焦点:
mEditText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
onFocusChange(View v, boolean hasFocus) {
EditText edit = (EditText) v;
String text = edit.getText().toString();
if (!hasFocus && text.length() > 0) {
edit.setText(text + "@gmail.com");
}
}
})