【问题标题】:Keyboard doesn't accept first character when changing inputs更改输入时键盘不接受第一个字符
【发布时间】:2010-09-13 16:17:59
【问题描述】:

我在 EditText 上设置了 TextWatcher,它在用户键入数字后跟空格后更改输入类型。

如果用户输入两个数字,输入类型会切换并接受下一个字符,但如果用户只输入一个数字并按空格键,输入类型仍然会改变,但不会接受用户尝试输入的第一个字符。

我已经在 Froyo 和 1.6 上对此进行了测试,它只发生在 Froyo 上,1.6 可以正常工作。

代码如下:

    TextWatcher watcher = new TextWatcher() {
    @Override
    public void afterTextChanged (Editable s) {
    }

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

    @Override
    public void onTextChanged (CharSequence s, int start, int before, int count) {          
        // Parsed text holder is a class that just parses the EditText and pulls out various parts.
        ParsedTextHolder th = parseTextHolder(s);

        String newText = "";
        Boolean setTextKeyListener = false;

        String tGetTextString = mQuery.getText().toString();

        if (!th.pFullMatch.equals("")) {
            if (th.pFullMatch.length() == 2) {
                mQuery.setKeyListener(new
                TextKeyListener(TextKeyListener.Capitalize.SENTENCES, true));
                newText = tGetTextString + " for ";
                setTextKeyListener = true;
            }
        }

        if (setTextKeyListener) {
            Log.i("setTextKeyListener", "true");
            if (mQuery.getKeyListener().getClass() != TextKeyListener.class) {
                    mQuery.setKeyListener(new TextKeyListener(TextKeyListener.Capitalize.SENTENCES, true));
            } else {
                    Log.d("setTextKeyListener", "skipped. already was text.");
            }

            if (!newText.equals("")) {
                    int position = newText.length();
                    String ttext = newText;
                    newText = "";
                    mQuery.setText(ttext, TextView.BufferType.EDITABLE);
                    mQuery.setText(ttext);
                    Editable text = mQuery.getEditableText();
                    Log.w("setting selectiont to text: ", text.toString());
                    Log.w("setting selectiont to position: ", Integer.toString(position));
                    Selection.setSelection(text, position);
                    mQuery.setKeyListener(new TextKeyListener(TextKeyListener.Capitalize.SENTENCES, true));
            }

        }
    }
};

另外,如果你想看看这个错误是什么样的,这里有一个 APK:http://endlesswhileloop.com/files/KeyboardBug.apk

【问题讨论】:

    标签: android android-edittext textwatcher android-2.2-froyo


    【解决方案1】:

    mQuery 是被观看的editText 吗?根据javadocs,您不应该对onTextChanged 中的EditText 中的文本进行任何更改。所有此类更改都应在afterTextChanged 中进行。

    一般来说,我最终检查了onTextChanged 中的更改,然后进行了导致afterTextChanged 更改的工作。你可以试试。

    【讨论】:

    • 刚刚尝试使用 afterTextChanged,没有运气。不过感谢您的回答,我没有意识到在 onTextChanged 中编辑 EditText 是不好的。
    • 嗯,好吧,你为什么在最后调用 refreshDrawableState?这似乎有点骇人听闻,可能会导致不同版本的差异..(这只是一个猜测,但通常当您必须强制刷新视图时,您实际上只是掩盖了一个潜在的问题)。
    • 啊,我有 refreshDrawableState 只是为了看看它是否会修复它,我删除了一堆不相关的东西,但仍然没有运气。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 2011-09-15
    • 1970-01-01
    • 1970-01-01
    • 2019-08-07
    相关资源
    最近更新 更多