效果(不会手机录制gif。。。所以。。。):
代码:
package com.example.xinenhuadaka.signin.ui;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import com.example.xinenhuadaka.R;
import java.util.ArrayList;
import java.util.List;
import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;
public class CodeActivity extends Activity{
@BindView(R.id.iv_return)
ImageView ivReturn;
@BindView(R.id.tv_phone)
TextView tvPhone;
@BindView(R.id.et1)
EditText et1;
@BindView(R.id.et2)
EditText et2;
@BindView(R.id.et3)
EditText et3;
@BindView(R.id.et4)
EditText et4;
@BindView(R.id.tv_time)
TextView tvTime;
private String phone;
private List<EditText> mEdits = new ArrayList<EditText>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_code);
ButterKnife.bind(this);
Intent intent = getIntent();
phone = intent.getStringExtra("phone");
init();
}
//初始化
private void init() {
Log.i("phone",phone);
tvPhone.setText("+86 "+phone.substring(0,3)+"-"+phone.substring(3,6)+"-"+phone.substring(6,phone.length()));
et1.setFocusable(true);
et1.setFocusableInTouchMode(true);
mEdits.add(et1);
mEdits.add(et2);
mEdits.add(et3);
mEdits.add(et4);
et1.addTextChangedListener(new MyTextWatcher());
et2.addTextChangedListener(new MyTextWatcher());
et3.addTextChangedListener(new MyTextWatcher());
et4.addTextChangedListener(new MyTextWatcher());
et1.setOnKeyListener(new MyOnKeyListener());
et2.setOnKeyListener(new MyOnKeyListener());
et3.setOnKeyListener(new MyOnKeyListener());
et4.setOnKeyListener(new MyOnKeyListener());
}
@OnClick({R.id.iv_return, R.id.tv_time})
public void onViewClicked(View view) {
switch (view.getId()) {
case R.id.iv_return:
finish();
break;
case R.id.tv_time:
break;
}
}
private class MyOnKeyListener implements View.OnKeyListener{
@Override
public boolean onKey(View view, int i, KeyEvent keyEvent) {
if (i == KeyEvent.KEYCODE_DEL && keyEvent.getAction() == KeyEvent.ACTION_DOWN) {
for (int i1=0;i1<mEdits.size();i1++){//遍历 确定是哪个输入框删除了内容
EditText editText = mEdits.get(i1);
if(editText.getText().toString().equals("")){//除了第一个和最后一个输入框 其他输入框 都要把焦点切换到上一个输入框,同时把上一个输入框的内容删掉
if(i1==0){//第一个 只删除内容
editText.setText("");
return true;
}
editText.setFocusable(false);
mEdits.get(i1-1).setText("");
mEdits.get(i1-1).setEnabled(true);
mEdits.get(i1-1).setFocusableInTouchMode(true);
mEdits.get(i1-1).requestFocus();
return true;
}
}
mEdits.get(mEdits.size()-1).setText("");
return true;
}
return false;
}
}
private class MyTextWatcher implements 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) {
StringBuffer strText=new StringBuffer("");//验证码
if (editable.length() != 0) {//判断是输入还是删除
for (int i=0;i<mEdits.size();i++){//遍历 确定是哪个输入框输入了内容
EditText editText = mEdits.get(i);
if(mEdits.get(i).getText().toString().equals("")){//当前为空,上一个输入框的焦点应切换到当前这个
mEdits.get(i-1).setFocusable(false);//上一个输入框失去焦点
//当前的输入框获得焦点,等待输入
editText.setEnabled(true);
editText.setFocusableInTouchMode(true);
editText.requestFocus();
strText.delete(0,strText.length());//如果需要切换焦点则清空验证码
return;
}
strText.append(mEdits.get(i).getText().toString());//记录验证码
}
//遍历完 无切换 得到验证码
Toast.makeText(CodeActivity.this, strText, Toast.LENGTH_SHORT).show();
}
}
}
}
布局:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".signin.ui.CodeActivity">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
tools:ignore="MissingConstraints"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
android:layout_marginTop="34dp"
android:layout_marginLeft="19dp"
android:id="@+id/iv_return"
android:src="@mipmap/back"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintTop_toBottomOf="@id/iv_return"
app:layout_constraintLeft_toLeftOf="@id/iv_return"
android:text="请输入验证码"
android:textSize="25dp"
android:textColor="@color/colorTvBlack"
android:layout_marginTop="52dp"
android:layout_marginLeft="32dp"
android:id="@+id/tv1"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintTop_toBottomOf="@id/tv1"
app:layout_constraintLeft_toLeftOf="@id/tv1"
android:text="验证码已发送至手机:"
android:textSize="12dp"
android:textColor="@color/colorTvBlack"
android:layout_marginTop="13dp"
android:id="@+id/tv2"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintTop_toTopOf="@id/tv2"
app:layout_constraintLeft_toRightOf="@id/tv2"
android:textSize="13dp"
android:textColor="#E83452"
android:text="+86 183-3405-3875"
android:layout_marginLeft="8dp"
android:id="@+id/tv_phone"
/>
<EditText
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintTop_toBottomOf="@id/tv2"
app:layout_constraintLeft_toLeftOf="@id/tv2"
app:layout_constraintRight_toLeftOf="@id/et2"
android:layout_marginTop="50dp"
app:layout_constraintDimensionRatio="1:1"
android:id="@+id/et1"
android:textSize="30dp"
android:textColor="@color/colorTvBlack"
android:gravity="center"
android:maxLength="1"
android:inputType="number"/>
<EditText
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintTop_toBottomOf="@id/tv2"
app:layout_constraintLeft_toRightOf="@id/et1"
app:layout_constraintRight_toLeftOf="@id/et3"
android:layout_marginTop="50dp"
app:layout_constraintDimensionRatio="1:1"
android:layout_marginLeft="12dp"
android:id="@+id/et2"
android:textSize="30dp"
android:textColor="@color/colorTvBlack"
android:gravity="center"
android:maxLength="1"
android:inputType="number"/>
<EditText
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintTop_toBottomOf="@id/tv2"
app:layout_constraintLeft_toRightOf="@id/et2"
app:layout_constraintRight_toLeftOf="@id/et4"
android:layout_marginTop="50dp"
app:layout_constraintDimensionRatio="1:1"
android:layout_marginLeft="12dp"
android:id="@+id/et3"
android:textSize="30dp"
android:textColor="@color/colorTvBlack"
android:gravity="center"
android:maxLength="1"
android:inputType="number"/>
<EditText
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintTop_toBottomOf="@id/tv2"
app:layout_constraintLeft_toRightOf="@id/et3"
app:layout_constraintRight_toRightOf="parent"
android:layout_marginTop="50dp"
app:layout_constraintDimensionRatio="1:1"
android:layout_marginLeft="12dp"
android:id="@+id/et4"
android:layout_marginRight="36dp"
android:textSize="30dp"
android:textColor="@color/colorTvBlack"
android:gravity="center"
android:maxLength="1"
android:inputType="number"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintTop_toBottomOf="@id/et1"
app:layout_constraintLeft_toLeftOf="@id/et1"
android:layout_marginTop="12dp"
android:id="@+id/tv_time"
android:textColor="#596168"
android:textSize="13dp"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintTop_toTopOf="@id/tv_time"
app:layout_constraintLeft_toRightOf="@id/tv_time"
android:text="后重发验证码或通过其他途径验证"
android:textColor="#596168"
android:textSize="13dp"
/>
</androidx.constraintlayout.widget.ConstraintLayout>