Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/191.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Android editText中同时使用keyListener和textChangedListener_Android_Android Edittext - Fatal编程技术网

在Android editText中同时使用keyListener和textChangedListener

在Android editText中同时使用keyListener和textChangedListener,android,android-edittext,Android,Android Edittext,我试着两者兼用 editPhoneNumber.setKeyListener(new KeyListener() 及 但它们似乎相互阻塞,我的编辑文本不再可编辑 谢谢你的帮助 编辑: 我正在尝试将输入格式化为用户类型: 输入:555111233 格式化输入:555 111 22 33 格式化部分工作得很好,但我尝试添加KeyListener的原因是当用户试图通过按delete键进行删除时,以及当输入长度变为(比方说)12个字符时,TextChangedListener总是在文本末尾加上一个字

我试着两者兼用

editPhoneNumber.setKeyListener(new KeyListener() 

但它们似乎相互阻塞,我的编辑文本不再可编辑

谢谢你的帮助

编辑:

我正在尝试将输入格式化为用户类型:

输入:555111233 格式化输入:555 111 22 33

格式化部分工作得很好,但我尝试添加KeyListener的原因是当用户试图通过按delete键进行删除时,以及当输入长度变为(比方说)12个字符时,TextChangedListener总是在文本末尾加上一个字符来中断用户的删除。这就是为什么我试图在输入为delete键时禁用TextChangedListener

boolean isResetClicked;
EditText editPhoneNumber;
Button buttonReset;

protected void onCreate(Bundle savedInstanceState)
{
    editPhoneNumber = (EditText) findViewById(R.id.editPhoneNumber);
    buttonReset = (Button) findViewById(R.id.buttonResetPhoneNumber);
    buttonReset.setOnClickListener(new OnClickListener()
    {

        @Override
        public void onClick(View v)
        {
            isResetClicked = true;
            editPhoneNumber.getText().clear();
            isResetClicked = false;
        }
    });

    editPhoneNumber.setKeyListener(new KeyListener()
    {

        @Override
        public boolean onKeyUp(View view, Editable text, int keyCode,
                KeyEvent event)
        {
            if (keyCode == KeyEvent.KEYCODE_DEL)
            {
                isResetClicked = true;
            }
            else
                isResetClicked=false;
            return false;
        }

        @Override
        public boolean onKeyOther(View view, Editable text, KeyEvent event)
        {
            // TODO Auto-generated method stub
            return false;
        }

        @Override
        public boolean onKeyDown(View view, Editable text, int keyCode,
                KeyEvent event)
        {

            return false;
        }

        @Override
        public int getInputType()
        {
            // TODO Auto-generated method stub
            return 0;
        }

        @Override
        public void clearMetaKeyState(View view, Editable content,
                int states)
        {
            // TODO Auto-generated method stub

        }
    });

    editPhoneNumber.addTextChangedListener(new TextWatcher()
    {

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

            if (!isResetClicked)
            {
                if (s.length() == 0)
                {
                    editPhoneNumber.setText("(");
                }
                if (s.length() == 1)
                {
                    str = editPhoneNumber.getText().toString();
                    editPhoneNumber.setText("(" + str);
                    editPhoneNumber.setSelection(editPhoneNumber.getText()
                            .length());
                }
                if (s.length() == 4)
                {
                    str = editPhoneNumber.getText().toString();
                    editPhoneNumber.setText(str + ") ");
                    editPhoneNumber.setSelection(editPhoneNumber.getText()
                            .length());
                }
                if (s.length() == 9)
                {
                    str = editPhoneNumber.getText().toString();
                    editPhoneNumber.setText(str + " ");
                    editPhoneNumber.setSelection(editPhoneNumber.getText()
                            .length());
                }
                if (s.length() == 12)
                {
                    str = editPhoneNumber.getText().toString();
                    editPhoneNumber.setText(str + " ");
                    editPhoneNumber.setSelection(editPhoneNumber.getText()
                            .length());
                }

            }

        }

        @Override
        public void beforeTextChanged(CharSequence s, int start, int count,
                int after)
        {
            // TODO Auto-generated method stub

        }

        @Override
        public void afterTextChanged(Editable s)
        {
        }
    });
编辑2:

即使我仍然无法理解为什么两个事件侦听器会阻止我的edittext,我还是通过修改代码解决了问题:

@Override
        public void onTextChanged(CharSequence s, int start, int before,
                int count)
        {
            String str;
            /*Log.i("ED",
                    "LengthBefore before (lengthBefore = lengthAfter;): "
                            + String.valueOf(lengthBefore));*/
            lengthBefore = lengthAfter;
            lengthAfter = s.length();
            /*Log.i("ED",
                    "LengthBefore after (lengthBefore = lengthAfter;): "
                            + String.valueOf(lengthBefore));*/
            if ((lengthBefore < lengthAfter) || lengthBefore == 0)
            {
                if (!isResetClicked)
                {
                    if (s.length() == 0)
                    {
                        editPhoneNumber.setText("(");
                    }
                    if (s.length() == 1)
                    {
                        str = editPhoneNumber.getText().toString();
                        editPhoneNumber.setText("(" + str);
                        editPhoneNumber.setSelection(editPhoneNumber
                                .getText().length());
                    }
                    if (s.length() == 4)
                    {
                        str = editPhoneNumber.getText().toString();
                        editPhoneNumber.setText(str + ") ");
                        editPhoneNumber.setSelection(editPhoneNumber
                                .getText().length());
                    }
                    if (s.length() == 9)
                    {
                        str = editPhoneNumber.getText().toString();
                        editPhoneNumber.setText(str + " ");
                        editPhoneNumber.setSelection(editPhoneNumber
                                .getText().length());
                    }
                    if (s.length() == 12)
                    {
                        str = editPhoneNumber.getText().toString();
                        editPhoneNumber.setText(str + " ");
                        editPhoneNumber.setSelection(editPhoneNumber
                                .getText().length());
                    }

                }
            }
            lengthAfter = s.length();
            /*Log.i("ED", "LengthAfter after (lengthAfter = s.length();): "
                    + String.valueOf(lengthAfter));
            Log.i("ED", "LengthBefore: " + String.valueOf(lengthBefore));
            Log.i("ED", "LengthAfter: " + String.valueOf(lengthAfter));*/

        }
当用户试图删除字符时,新的长度将比旧的长度短。因此,我通过以下方式阻止代码检查长度:

if ((lengthBefore < lengthAfter) || lengthBefore == 0)

你有更多的示例代码吗?你的密钥侦听器和文本更改侦听器在做什么,使你认为它们在互相阻止?用另一种方法解决它,请检查编辑2。
if ((lengthBefore < lengthAfter) || lengthBefore == 0)