仿滴滴输入框,edittext各种操作集合

来来来,先看效果图。

在这里插入图片描述

先说说思路吧

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;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值