提问者:小点点

EditTexts之间的连续键入


我有3个< code > edittext(et1,et2,et3),彼此相邻排列,其中< code>maxLength为“1”。

我的要求是:

> < li>

当在编辑文本中键入字母时(只能包含1个字符,因为最大长度为1),光标会自动转到下一个编辑文本。

类似地,当用户单击et2上的back时,光标应该转到et1。

编辑文本将按顺序填写。首先是第一个,然后是第二个,最后是第三个。因此,即使用户单击第三个编辑文本框

如何以编程方式实现这一点。

谢谢


共2个答案

匿名用户

主要思想是使用TextWatcher。

您可以使用类似如下的内容:

et1.addTextChangedListener(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) {
         et2.requestFocus;
         et1.setEnabled(false);
    }

    @Override
    public void afterTextChanged(Editable s) {
    }
});

et2.addTextChangedListener(new TextWatcher() {
        String textBeforeChange;

        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
          textBeforeChange = s.subSequence(start, start + count).toString();
        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
              if (s.subSequence(start, start + count).length == 0 
                   && textBeforeChange .length >= 1)
            et1.requestFocus();
        }

        @Override
        public void afterTextChanged(Editable s) {
        }
    });

匿名用户

以下是您的问题答案:

    //findViewById and bla bla bla...

    editText1.addTextChangedListener(new TextWatcher() {



        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {

            editText1.setSelection(count); //set the cursor after the last character

        }




        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {


        }




        @Override
        public void afterTextChanged(Editable s) {



            if(editText1.length() == 1){ //check for number of characters

                editText1.clearFocus();

                editText2.requestFocus();

            }



        }




    });

    editText2.addTextChangedListener(new TextWatcher() {



        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {

            editText2.setSelection(count);


            if(editText1.length() != 1){ //check if previous editText is empty

                editText2.clearFocus();

                editText1.requestFocus();

            }



        }




        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {


        }




        @Override
        public void afterTextChanged(Editable s) {



            if(editText2.length() == 1){

                editText2.clearFocus();

                editText3.requestFocus();

            }



        }




    });


    editText3.addTextChangedListener(new TextWatcher() {



        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {


            editText3.setSelection(count);


            if(editText1.length() != 1){ //check if first editText is empty

                editText3.clearFocus();

                editText1.requestFocus();

            }



            else if(editText2.length() != 1){ //check if second editText is empty

                editText3.clearFocus();

                editText2.requestFocus();

            }



        }




        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {


        }




        @Override
        public void afterTextChanged(Editable s) {



            if(editText3.length() == 1){

                //Do something after the last editText was typed

            }



        }




    });








    //user pressed the back button
    @Override
    public void onBackPressed(){



        if(editText2.isFocused()){

            editText2.clearFocus();

            editText1.requestFocus();

        } 



        else if(editText3.isFocused(){

            editText3.clearFocus();

            editText2.requestFocus();

        } 



        else super.onBackPressed();



    }