来来来,先看效果图。
先说说思路吧
1、用我们常用的 五大布局选个合适的,套10个editext
2、监听,每个editext输入字符后,焦点跳到下一个没有的字符的edittext上
3、监听删除键,没有字符则,焦点倒回上个editext
emmm。。。。。好像没有了
这里留了一个坑,就是宽度是,留了左右margin 23dp的,本来要动态测量的
看这个布局就知道了
<com.mengbao.baselibrary.view.SeparateEditView
android:id="@+id/register_separate_edit"
android:layout_marginTop="10dp"
android:layout_height="50dp"
android:layout_width="match_parent"
android:layout_marginLeft="23dp"
android:layout_marginRight="23dp"
/>
import android.content.Context;
import android.os.Handler;
import android.text.Editable;
import android.text.InputFilter;
import android.text.InputType;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.text.method.DigitsKeyListener;
import android.util.AttributeSet;
import android.view.Gravity;
import android.view.KeyEvent;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
import android.widget.EditText;
import android.widget.LinearLayout;
import androidx.annotation.Nullable;
import com.mengbao.baselibrary.R;
import com.mengbao.baselibrary.net.BaseService;
import com.mengbao.baselibrary.util.LogUtil;
import com.mengbao.baselibrary.util.ScreenUtils;
import java.util.ArrayList;
import java.util.List;
public class SeparateEditView extends LinearLayout {
private int mNumber = 10;
private Context mContext;
private List<EditText> mList = new ArrayList<>();
public SeparateEditView(Context context) {
this(context, null);
}
public SeparateEditView(Context context, @Nullable AttributeSet attrs) {
this(context, attrs, 0);
}
public SeparateEditView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
mContext = context;
init();
}
private void init() {
setWillNotDraw(false);
setOrientation(HORIZONTAL);
int screenWidth = ScreenUtils.getScreenWidth(mContext);
//得到这个控件的宽度,固定了两边的margin为23
int w = screenWidth - ScreenUtils.dip2px(BaseService.getInstance().mContext, 23f) * 2;
if (getChildCount() >= mNumber) {
return;
}
int margin = ScreenUtils.dip2px(BaseService.getInstance().mContext, 3f);
int width = (w - (9 * margin)) / 10;
float height = (width * 1.3f);
for (int i = 0; i < mNumber; i++) {
EditText editText = new EditText(mContext);
editText.setFilters(new InputFilter[]{new InputFilter.LengthFilter(1)});
editText.setGravity(Gravity.CENTER);
editText.addTextChangedListener(new EditWatcher());
editText.setKeyListener(DigitsKeyListener.getInstance("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"));
editText.setRawInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD);
editText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(final View v, boolean hasFocus) {
if (hasFocus) {
//得到焦点使光标放到文字后面,为了更好的用户体验
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
((EditText) v).setSelection(((EditText) v).getText().length());
}
}, 250);
}
}
});
editText.setOnKeyListener(new OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
EditText e = ((EditText) v);
if (keyCode == KeyEvent.KEYCODE_DEL && e.getText().length() == 0 && event.getAction() == KeyEvent.ACTION_DOWN) {
LogUtil.e(((EditText) v).getText().length() + " " + (e == mList.get(0)));
if (e == mList.get(0)) {
return false;
}
for (int j = 0; j < mList.size(); j++) {
if (e==mList.get(j)){
mList.get(j-1).requestFocus();
return true;
}
}
}
return false;
}
});
LayoutParams layoutParams = new LayoutParams(width, (int) height);
if (i != 0) {
layoutParams.leftMargin = margin;
}
editText.setBackgroundResource(R.drawable.edit_bg);
editText.setLayoutParams(layoutParams);
addView(editText);
mList.add(editText);
}
}
private class EditWatcher 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) {
if (editable.length() != 0) {
focus();
}
}
}
private void focus() {
EditText editText;
//利用for循环找出前面还没被输入字符的EditText
for (int i = 0; i < mList.size(); i++) {
editText = mList.get(i);
if (editText.getText().length() < 1) {
editText.requestFocus();
return;
}
}
EditText lastEditText = mList.get(mList.size() - 1);
if (lastEditText.getText().length() > 0) {
//收起软键盘
InputMethodManager imm = (InputMethodManager) getContext()
.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS);
}
}
/**
*
* @return 返回所有 editText 拼接起来的字符串
*/
public String getString(){
StringBuilder builder=new StringBuilder();
for (int i = 0; i < mList.size(); i++) {
builder.append(mList.get(i).getText().toString());
}
return builder.toString();
}
/**
* @return 返回 true 则表示 editText 都填满了
*/
public boolean isPackFull(){
for (int i = 0; i < mList.size(); i++) {
if (TextUtils.isEmpty(mList.get(i).getText().toString())){
return false;
}
}
return true;
}
}