华硕Zenfone(Android)TextView \ TextWatcher键盘输入错误

时间:2015-07-29 12:00:17

标签: android android-edittext textwatcher android-input-filter

更新:实际上,这不是华硕手机的问题,这是华硕ZenUI键盘的问题。您可以安装自己喜欢的键盘来解决问题。我已经安装了Google键盘测试了Zenfone 2。我TextWatcher中的所有内容都可以正常使用。但它不是错误修复或问题解决方案。

我的InputFilter附加了两个TextWatcher和一个EditText

InputFilters:标准InputFilter.AllCaps()过滤器和自定义'字母characetrs'。他们是神奇的。

TextWatcher进行了一些文本转换(将符号从俄语翻译成英语)。 TextWatcher也可以正常工作,但不适用于华硕手机(在Zenfone 4和5上测试过)。 Nexus 5,Genymotion模拟器和三星设备都可以。

问题是华硕手机不允许输入多个符号。可能是TextWatchersetSelection()出现问题(禁用TextWatcher时,一切正常。

列出TextView

etCardholder.setFilters(new InputFilter[]{new InputFilter.AllCaps(), new NameInputeFilter(false)});

twTransliterator = 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) {
        etCardholder.removeTextChangedListener(twTransliterator);
        etCardholder.setText(StringTools.transliterateCharacterRuToEn(s.toString()));
        etCardholder.addTextChangedListener(twTransliterator);
    }

    @Override
    public void afterTextChanged(Editable s) {
        etCardholder.setSelection(etCardholder.getText().length());
        validateCardData();
    }
};

etCardholder.addTextChangedListener(twTransliterator);

我尝试过不用setSelection()设置光标的位置,而是使用append()。这里结果相同。

你有什么想法可能吗?以及如何绕过它?

2 个答案:

答案 0 :(得分:2)

我找到了解决此问题的方法,我的情况是EditText上的inputType属性带有以下参数:textCapCharacters,我使用textNoSuggestions进行解析。您也可以将两者与管道运算符'|'一起使用。

  let isBlack = true;
  function animate() {
    $(".someDiv").animate({
      backgroundColor: isBlack ? "transparent" : 'black'
    }, 20);
    isBlack = !isBlack;
  }

  const delay = ms => new Promise(res => setTimeout(res, ms));
  async function animateAndWait(msArr) {
    for (let i = 0; i < msArr.length; i++) {
      animate();
      await delay(msArr[i]);
    }
  }

  flashFunction();

  async function flashFunction() {
    await animateAndWait([300, 50]);
    if (myRandomNumberBetween(1, 100) <= 10) {
      return delay(3000)
        .then(flashFunction);
    }
    await animateAndWait([300, 400]);
      delay(3000)
        .then(flashFunction);
  }

答案 1 :(得分:1)

面向未来的Google员工!

该错误来自问题所提及的华硕ZenUI的键盘。 @Gabriel Correra建议的解决方法完全解决了这个问题, 但是,您可能不想为所有用户设置此标志,因为不是每个人都在使用该越野车键盘。

使用此代码片段,您可以确定用户的默认键盘是否为Asus ZenUI's keyboard,如果是,则以编程方式添加上述标记,并让其他用户喜欢他们的建议!

String def = Settings.Secure.getString(getContext().getContentResolver(), Settings.Secure.DEFAULT_INPUT_METHOD);
if(def.equals("com.asus.ime/.IME")) {
   setInputType(getInputType() | InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS);
}