edittext.settext() 将键盘类型更改为默认 [从 ?123 更改为 ABC]

问题描述 投票:0回答:3

我的编辑文本格式有以下代码,因为它可以接受任何输入,所以我没有设置任何输入类型:

if (cardNumberEditText != null) {
    cardNumberEditText.addTextChangedListener(new TextWatcher() {

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            int currSel = cardNumberEditText.getSelectionStart();
            cardNumberEditText.removeTextChangedListener(textWatcher);
            .
            .
            cardNumberEditText.setText(formattedNumber);
            .
            .
            cardNumberEditText.setSelection(currSel);
            cardNumberEditText.addTextChangedListener(textWatcher);
        }

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

        @Override
        public void afterTextChanged(Editable s) {

        }
    });
}

所以最初我得到的默认输入类型是 ABC,现在当我将其更改为 ?123(使用 ABC/123? 切换按钮)时,输入一些数字后键盘会变回 ABC。此代码在三星设备 s3 和 sywpe 上运行良好,但在 L 和 HTC one 的 Nexus 上运行不佳

当我注释 onTextChanged 中的所有代码时,它工作正常。所以当我调查时我发现罪魁祸首是cardNumberEditText.setText(formattedNumber);

我没有设置任何输入类型,我只是使用键盘上的 ABC/?123 切换键进行切换

任何帮助/建议为什么会发生这种情况(在少数设备上)以及如何纠正它??

android keyboard android-edittext android-softkeyboard
3个回答
41
投票

终于让它工作了,必须结合上面评论中提到的多个解决方案

由于有罪的是 settext,我找到了它的替代品 - 追加

但要使用追加,我必须清除编辑文本而不使用settext,此链接来救援

所以更换了

cardNumberEditText.setText(formattedNumber);

cardNumberEditText.getText().clear();
cardNumberEditText.append(formattedNumber);

现在就像魅力一样


0
投票

我也遇到了类似的问题,但是在我拨打电话后键盘已更改为默认值 显示键盘时

scrollView.fullScroll(NestedScrollView.FOCUS_DOWN)
我刚刚将
fullScroll
方法替换为
smoothScrollTo
,一切正常


0
投票

除了已接受的答案之外,如果其他人在

.append()
之后难以将光标移动到末尾,以下是保留光标位置的方法:

val cursor = editText.selectionEnd
editText.text?.clear()
editText.append(input)
editText.setSelectionSafe(cursor)

其中

setSelectionSafe()
是我用来防止挤压的扩展

fun EditText?.setSelectionSafe(index: Int) {
    if (this == null || index > this.length()) return
    this.setSelection(index)
}

这对于输入和删除都有效!

© www.soinside.com 2019 - 2024. All rights reserved.