여섯 칸짜리 비밀번호 입력상자

12130 단어 android
작은 수요 앱을 만나면 위챗 비밀번호 결제와 비슷한 6개의 작은 칸의 입력 상자를 만들어야 한다. 인터넷에서 찾아보니 아직도 많은 해결 방안이 있다. 그들의 생각을 살펴보고 대체적으로 자신이 6개의 입력 상자를 썼다. 입력 상자에 따라 초점을 맞춘 상황과 입력 글자 수를 얻는 상황에 따라다음 입력 상자에 초점을 가져올지 판단하고, 감청 삭제 단추에 따라 이전 입력 상자에 초점을 가져올지 판단합니다
코드 설명 1 포장 Edittext 코드
public class LastInputEditText extends EditText {
    public LastInputEditText(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    public LastInputEditText(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public LastInputEditText(Context context) {
        super(context);
    }

    public void onSelectionChanged(int selStart, int selEnd) {
        super.onSelectionChanged(selStart, selEnd);//          
        if (selStart == selEnd) {//      
            setSelection(getText().length());
        }
    }
}

2 포장된 6개의 입력 상자의 LinearLayout
public class PasswordView extends LinearLayout {
    private LastInputEditText etone;
    private LastInputEditText ettwo;
    private LastInputEditText etthree;
    private LastInputEditText etfour;
    private LastInputEditText etfive;
    private LastInputEditText etsix;
    private Context mContext;
    private View converview;

    private StringBuilder stringBuilder;
    private InputMethodManager imm;

    public PasswordView(Context context, AttributeSet attrs) {
        super(context, attrs);
        this.mContext = context;
        imm = (InputMethodManager)mContext.getSystemService(INPUT_METHOD_SERVICE);
        initView();
    }

    private void initView() {
        converview = LayoutInflater.from(mContext).inflate(R.layout.layout_password, null);
        etone = (LastInputEditText) converview.findViewById(R.id.et_one);
        ettwo = (LastInputEditText) converview.findViewById(R.id.et_two);
        etthree = (LastInputEditText) converview.findViewById(R.id.et_three);
        etfour = (LastInputEditText) converview.findViewById(R.id.et_four);
        etfive = (LastInputEditText) converview.findViewById(R.id.et_five);
        etsix = (LastInputEditText) converview.findViewById(R.id.et_six);

        etone.addTextChangedListener(textWatcher);
        ettwo.addTextChangedListener(textWatcher);
        etthree.addTextChangedListener(textWatcher);
        etfour.addTextChangedListener(textWatcher);
        etfive.addTextChangedListener(textWatcher);
        etsix.addTextChangedListener(textWatcher);

        etone.setOnKeyListener(onKeyListener);
        ettwo.setOnKeyListener(onKeyListener);
        etthree.setOnKeyListener(onKeyListener);
        etfour.setOnKeyListener(onKeyListener);
        etfive.setOnKeyListener(onKeyListener);
        etsix.setOnKeyListener(onKeyListener);

        etone.setTransformationMethod(passwordTransformationMethod);
        ettwo.setTransformationMethod(passwordTransformationMethod);
        etthree.setTransformationMethod(passwordTransformationMethod);
        etfour.setTransformationMethod(passwordTransformationMethod);
        etfive.setTransformationMethod(passwordTransformationMethod);
        etsix.setTransformationMethod(passwordTransformationMethod);
        converview.setOnTouchListener(new OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                return true;
            }
        });
        this.addView(converview);
    }


    private TextWatcher textWatcher = 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 (etone.isFocused()) {
                    ettwo.requestFocus();
                } else if (ettwo.isFocused()) {
                    etthree.requestFocus();
                } else if (etthree.isFocused()) {
                    etfour.requestFocus();
                } else if (etfour.isFocused()) {
                    etfive.requestFocus();
                } else if (etfive.isFocused()) {
                    etsix.requestFocus();
                } else if (etsix.isFocused()) {

                }
            }
        }
    };


    private PasswordTransformationMethod passwordTransformationMethod = new PasswordTransformationMethod() {
        @Override
        public CharSequence getTransformation(CharSequence source, View view) {
            return new PasswordCharSequence(source);
        }

    };

    private OnKeyListener onKeyListener = new OnKeyListener() {
        @Override
        public boolean onKey(View v, int keyCode, KeyEvent event) {
            if (keyCode == KeyEvent.KEYCODE_DEL && event.getAction() == KeyEvent.ACTION_DOWN) {
                if (etsix.isFocused() && etsix.getText().length() == 0) {
                    etfive.requestFocus();
                    etfive.setText("");
                } else if (etfive.isFocused() && etfive.getText().length() == 0) {
                    etfour.requestFocus();
                    etfour.setText("");
                } else if (etfour.isFocused() && etfour.getText().length() == 0) {
                    etthree.requestFocus();
                    etthree.setText("");
                } else if (etthree.isFocused() && etthree.getText().length() == 0) {
                    ettwo.requestFocus();
                    ettwo.setText("");
                } else if (ettwo.isFocused() && ettwo.getText().length() == 0) {
                    etone.requestFocus();
                    etone.setText("");
                }
            }
            return false;
        }
    };

    class PasswordCharSequence implements CharSequence {
        private CharSequence mSource;

        public PasswordCharSequence(CharSequence source) {
            mSource = source;
        }

        @Override
        public int length() {
            return mSource.length();
        }

        @Override
        public char charAt(int index) {
            return '●';
        }

        @Override
        public CharSequence subSequence(int start, int end) {
            return mSource.subSequence(start, end);
        }
    }

    private StringBuilder getValue() {
        stringBuilder = null;
        stringBuilder = new StringBuilder();
        return stringBuilder.append(etone.getText().toString())
                .append(ettwo.getText().toString())
                .append(etthree.getText().toString())
                .append(etfour.getText().toString())
                .append(etfive.getText().toString())
                .append(etsix.getText().toString());
    }


}

레이아웃 파일은 설명하지 않겠습니다. 아주 간단합니다. 사실 문제가 하나 있습니다. 디자인할 때 손으로 터치해서 초점을 얻지 못하게 하려고 했지만 키보드의 뻗기와 접기는 제어하기 어려웠습니다.

좋은 웹페이지 즐겨찾기