最近用到了两种类型的密码框,其中一类是下划线类型的,要能够实现连续输入,连续删除操作,这个要求edittext输入时焦点后移,删除时焦点前移。话不多说,直接贴代码:
输入完6位密码自动提示:
public class MainActivity extends AppCompatActivity {
private UnderLineView3 mInputView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init();
}
private void init() {
mInputView = (UnderLineView3) findViewById(R.id.input_pwd);
mInputView.setOnFinishListener(new UnderLineView3.FinishInputListener() {
@Override
public void onFinish(String code) {
Toast.makeText(MainActivity.this, "您输入的密码为:" + code, Toast.LENGTH_LONG).show();
}
});
}
其中自定义密码输入框为:
public class UnderLineView3 extends RelativeLayout implements View.OnKeyListener {
private Context mContext;
private EditText et_one, et_two, et_three, et_four, et_five, et_six;
public UnderLineView3(Context context) {
this(context, null);
}
public UnderLineView3(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public UnderLineView3(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
this.mContext = context;
LayoutInflater.from(mContext).inflate(R.layout.cvv2_underline_view3, this);
init();
}
private void init() {
et_one = (EditText) findViewById(R.id.et_pay1);
et_two = (EditText) findViewById(R.id.et_pay2);
et_three = (EditText) findViewById(R.id.et_pay3);
et_four = (EditText) findViewById(R.id.et_pay4);
et_five = (EditText) findViewById(R.id.et_pay5);
et_six = (EditText) findViewById(R.id.et_pay6);
et_one.addTextChangedListener(mTextWatcher);
et_two.addTextChangedListener(mTextWatcher);
et_three.addTextChangedListener(mTextWatcher);
et_four.addTextChangedListener(mTextWatcher);
et_five.addTextChangedListener(mTextWatcher);
et_six.addTextChangedListener(mTextWatcher);
et_one.setOnKeyListener(this);
et_two.setOnKeyListener(this);
et_three.setOnKeyListener(this);
et_four.setOnKeyListener(this);
et_five.setOnKeyListener(this);
et_six.setOnKeyListener(this);
}
private TextWatcher mTextWatcher = 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) {
if (s.toString().length() == 1) {
if (et_one.isFocused() && TextUtils.isEmpty(et_two.getText().toString())) {
et_one.clearFocus();
et_two.requestFocus();
} else if (et_two.isFocused() && TextUtils.isEmpty(et_three.getText().toString())) {
et_two.clearFocus();
et_three.requestFocus();
} else if (et_three.isFocused()) {
et_four.requestFocus();
et_three.clearFocus();
} else if (et_four.isFocused() && TextUtils.isEmpty(et_five.getText().toString())) {
et_five.requestFocus();
et_four.clearFocus();
} else if (et_five.isFocused() && TextUtils.isEmpty(et_six.getText().toString())) {
et_six.requestFocus();
et_five.clearFocus();
} else if (et_six.isFocused()) {
et_six.requestFocus();
}
}
checkInput();
}
};
private void checkInput() {
if (!TextUtils.isEmpty(et_one.getText().toString().trim()) && !TextUtils.isEmpty(et_two.getText().toString().trim()) &&
!TextUtils.isEmpty(et_three.getText().toString().trim()) && !TextUtils.isEmpty(et_four.getText().toString().trim()) && !TextUtils.isEmpty(et_five.getText().toString().trim()) &&
!TextUtils.isEmpty(et_six.getText().toString().trim())) {
mListener.onFinish(getStr());
}
}
private String getStr() {
return et_one.getText().toString().trim() + et_two.getText().toString().trim() + et_three.getText().toString().trim()+et_four.getText().toString().trim()+et_five.getText().toString().trim()+et_six.getText().toString().trim();
}
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if (event.getAction() == KeyEvent.ACTION_DOWN && event.getKeyCode() == KeyEvent.KEYCODE_DEL) {
if (et_six.isFocused()) {
et_five.requestFocus();
et_six.setText("");
} else if (et_five.isFocused()) {
et_four.requestFocus();
et_five.setText("");
} else if (et_four.isFocused()) {
et_three.requestFocus();
et_four.setText("");
} else if (et_three.isFocused()) {
et_two.requestFocus();
et_three.setText("");
} else if (et_two.isFocused()) {
et_one.requestFocus();
et_two.setText("");
} else if (et_one.isFocused()) {
et_one.setText("");
et_one.requestFocus();
}
return true;
}
return false;
}
public FinishInputListener mListener;
public void setOnFinishListener(FinishInputListener listener) {
this.mListener = listener;
}
public interface FinishInputListener {
void onFinish(String code);
}
}
最终效果:
![这里写图片描述](https://img-blog.csdn.net/20170318155655404?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY2hlbmhxMzA1/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)