我有3个< code > edittext(et1,et2,et3),彼此相邻排列,其中< code>maxLength为“1”。
我的要求是:
> < li>
当在编辑文本中键入字母时(只能包含1个字符,因为最大长度为1),光标会自动转到下一个编辑文本。
类似地,当用户单击et2上的back时,光标应该转到et1。
编辑文本将按顺序填写。首先是第一个,然后是第二个,最后是第三个。因此,即使用户单击第三个编辑文本框
如何以编程方式实现这一点。
谢谢
主要思想是使用TextWatcher。
您可以使用类似如下的内容:
et1.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) {
et2.requestFocus;
et1.setEnabled(false);
}
@Override
public void afterTextChanged(Editable s) {
}
});
et2.addTextChangedListener(new TextWatcher() {
String textBeforeChange;
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
textBeforeChange = s.subSequence(start, start + count).toString();
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
if (s.subSequence(start, start + count).length == 0
&& textBeforeChange .length >= 1)
et1.requestFocus();
}
@Override
public void afterTextChanged(Editable s) {
}
});
以下是您的问题答案:
//findViewById and bla bla bla...
editText1.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
editText1.setSelection(count); //set the cursor after the last character
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable s) {
if(editText1.length() == 1){ //check for number of characters
editText1.clearFocus();
editText2.requestFocus();
}
}
});
editText2.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
editText2.setSelection(count);
if(editText1.length() != 1){ //check if previous editText is empty
editText2.clearFocus();
editText1.requestFocus();
}
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable s) {
if(editText2.length() == 1){
editText2.clearFocus();
editText3.requestFocus();
}
}
});
editText3.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
editText3.setSelection(count);
if(editText1.length() != 1){ //check if first editText is empty
editText3.clearFocus();
editText1.requestFocus();
}
else if(editText2.length() != 1){ //check if second editText is empty
editText3.clearFocus();
editText2.requestFocus();
}
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable s) {
if(editText3.length() == 1){
//Do something after the last editText was typed
}
}
});
//user pressed the back button
@Override
public void onBackPressed(){
if(editText2.isFocused()){
editText2.clearFocus();
editText1.requestFocus();
}
else if(editText3.isFocused(){
editText3.clearFocus();
editText2.requestFocus();
}
else super.onBackPressed();
}