在android的“所有编辑文本”视图中的“编辑文本”中输入所有文本后,添加并显示toast中的所有文本

在android的“所有编辑文本”视图中的“编辑文本”中输入所有文本后,添加并显示toast中的所有文本,android,Android,这是我的代码我有4个编辑文本当我在第一个编辑文本键中输入值时光标移动到另一个编辑文本当输入第二个编辑文本键光标移动到第三个文本当输入第三个编辑文本键光标移动到第四个我想要当我输入第四个编辑文本时我想要在toast中显示所有文本值,即edittext1.gettext+edittext2.gettext+edittext3.gettext+edittext4.gettext=1234其中1在编辑文本中输入1在编辑文本中输入2在输入3在输入3在输入4在输入4分别请建议我哪里做错了。为什么它不显示所有

这是我的代码我有4个编辑文本当我在第一个编辑文本键中输入值时光标移动到另一个编辑文本当输入第二个编辑文本键光标移动到第三个文本当输入第三个编辑文本键光标移动到第四个我想要当我输入第四个编辑文本时我想要在toast中显示所有文本值,即edittext1.gettext+edittext2.gettext+edittext3.gettext+edittext4.gettext=1234其中1在编辑文本中输入1在编辑文本中输入2在输入3在输入3在输入4在输入4分别请建议我哪里做错了。为什么它不显示所有文本值它只显示U 34请帮助

在EditText TextWatchers中,您使用beforeTextChanged删除字符串的第一个索引值:

public class MainActivity extends ActionBarActivity {
    EditText edtPasscode1;
    EditText edtPasscode2;
    EditText edtPasscode3;
    EditText edtPasscode4;
    Button button1;
    StringBuilder sb;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        edtPasscode1 = (EditText) findViewById(R.id.editText1);
        edtPasscode2 = (EditText) findViewById(R.id.editText2);
        edtPasscode3 = (EditText) findViewById(R.id.editText3);
        edtPasscode4 = (EditText) findViewById(R.id.editText4);
        button1 = (Button) findViewById(R.id.button1);

        sb = new StringBuilder();
        sb.append(edtPasscode1.getText().toString());
        sb.append(edtPasscode2.getText().toString());
        sb.append(edtPasscode3.getText().toString());
        sb.append(edtPasscode4.getText().toString());

        edtPasscode1.addTextChangedListener(new TextWatcher() {

            @Override
            public void onTextChanged(CharSequence s, int start, int before,
                    int count) {
                // TODO Auto-generated method stub
                if (sb.length() == 0 & edtPasscode1.length() == 1) {
                    sb.append(s);
                    edtPasscode1.clearFocus();
                    edtPasscode2.requestFocus();
                    edtPasscode2.setCursorVisible(true);

                }
            }

            @Override
            public void beforeTextChanged(CharSequence s, int start, int count,
                    int after) {
                // TODO Auto-generated method stub
                if (sb.length() == 1) {

                    sb.deleteCharAt(0);

                }

            }

            @Override
            public void afterTextChanged(Editable s) {
                // TODO Auto-generated method stub
                if (sb.length() == 0) {

                    edtPasscode1.requestFocus();
                }
            }
        });

        edtPasscode2.addTextChangedListener(new TextWatcher() {

            @Override
            public void onTextChanged(CharSequence arg0, int arg1, int arg2,
                    int arg3) {
                // TODO Auto-generated method stub
                if (sb.length() == 0 & edtPasscode2.length() == 1) {
                    sb.append(arg0);
                    edtPasscode2.clearFocus();
                    edtPasscode3.requestFocus();
                    edtPasscode3.setCursorVisible(true);

                }
            }

            @Override
            public void beforeTextChanged(CharSequence arg0, int arg1,
                    int arg2, int arg3) {
                // TODO Auto-generated method stub
                sb.deleteCharAt(0);
            }

            @Override
            public void afterTextChanged(Editable arg0) {
                // TODO Auto-generated method stub
                if (sb.length() == 0) {

                    edtPasscode2.requestFocus();
                }
            }
        });

        edtPasscode3.addTextChangedListener(new TextWatcher() {

            @Override
            public void onTextChanged(CharSequence s, int start, int before,
                    int count) {
                // TODO Auto-generated method stub
                if (sb.length() == 0 & edtPasscode3.length() == 1) {
                    sb.append(s);
                    edtPasscode3.clearFocus();
                    edtPasscode4.requestFocus();
                    edtPasscode4.setCursorVisible(true);

                }
            }

            @Override
            public void beforeTextChanged(CharSequence s, int start, int count,
                    int after) {
                // TODO Auto-generated method stub
                sb.deleteCharAt(0);
            }

            @Override
            public void afterTextChanged(Editable s) {
                // TODO Auto-generated method stub
                if (sb.length() == 0) {

                    edtPasscode3.requestFocus();
                }
            }
        });


        edtPasscode4.addTextChangedListener(new TextWatcher() {

            @Override
            public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
                // TODO Auto-generated method stub
                if (sb.length() == 0 & edtPasscode4.length() == 1) {
                    sb.append(arg0);
                    edtPasscode4.clearFocus();

                }
            }

            @Override
            public void beforeTextChanged(CharSequence arg0, int arg1, int arg2,
                    int arg3) {
                // TODO Auto-generated method stub

            }

            @Override
            public void afterTextChanged(Editable arg0) {
                // TODO Auto-generated method stub
                Toast.makeText(getApplicationContext(), sb.append(arg0).toString(), 10000).show();
            }
        });

    }



}
这将删除为1和2输入的字符。在EditText 4中不执行此操作,因此结果包括3和4,如上所述

您可能不应该使用此选项。问题是您正试图自动更改焦点,如果输入了错误的字符,这可能是一种糟糕的用户体验。这似乎就是你要解释的

您可能不应该尝试自动将光标从一个空间移动到另一个空间,或者在输入字符时仅启用每个空间,并阻止输入多个字符。然后像现在一样使用第四版的PostTextChanged

编辑:

因为您使用的是TextWatcher,所以除了限制键入的字符数外,您不应该在beforeTextChanged中执行任何操作。在ContextChanged中,可以监视有效字符。您可能只应该尝试在afterTextChanged中更改焦点,但即使这样也不太推荐,因为尝试键入2个字符,例如键入3后重新获得焦点,然后简单键入4,可能会导致恼人/意外的用户体验

编辑2:

您的代码中仍然存在bug-例如,您正在第二版文本中执行检查sb.length==0-但它的长度应该为1,对吗?在我的回答中,我建议您在Toast之前不要尝试构建字符串,因为请求焦点与禁用焦点不同,因此在您的交互UX逻辑正确之前,您可能会得到奇怪的结果

换句话说,你问为什么它只显示'34',我回答说。现在,您在构建字符串时遇到了一个不同的错误。如果用户返回到edittext并删除字符,您将有更多的bug,因为您的StringBuilder总是追加而从不删除字符。您还必须根据用户所在的位置跟踪要修改的索引

此外,您的后文本更改代码没有意义-您尝试在StringBuilder的长度为0时请求焦点,但只有在您从sb中删除时才会发生这种情况,而您没有这样做。所以我不确定你想做什么,但它看起来不像是在做你想做的

编辑3:

下面是一个应该有帮助的例子。暂时不要使用StringBuilder

在edtPasscode4中,执行以下操作:


如果我开除某人,我该怎么办;我在哪里做我必须删除的我编辑了我的答案。短版本-是的,删除所有那些deleteCharAt调用…嗯-什么是不工作的?同样的结果?如果是,则不可能-除非您进行了其他更改,否则某些内容必须已更改,未正确生成,等等…是-从所有EditText中删除deleteCharAt。另外,在第4种情况下,从所有EditText.getText.toString构建最终字符串;保留一个动态构建的字符串的当前状态没有任何意义,是吗??当你完成的时候就开始建造它。。。
sb.deleteCharAt(0);
        @Override
        public void afterTextChanged(Editable arg0) {
            // TODO Auto-generated method stub
            Toast.makeText(getApplicationContext(), 
                 edtPasscode1.getText().toString() +
                 edtPasscode2.getText().toString() +
                 edtPasscode3.getText().toString() +
                 edtPasscode4.getText().toString() +
                 , 10000).show();
        }