在Android 5上自动完成查看奇怪的行为

时间:2015-01-19 11:06:12

标签: android android-5.0-lollipop autocompletetextview

我的应用程序中有一个自动完成文本视图,它在Android Jelybean和Kitkat上按预期工作,但在Lolipop没有。 首先,在活动的第一次运行时(安装后),下拉列表根本不会出现,但是从第二次开始,然后显示正常。 但最重要的是,当我从列表中选择一个项目时,它没有得到正确的值。以下是相关代码:

mInput.setOnItemClickListener(new OnItemClickListener() {

@Override
public void onItemClick(AdapterView<?> parent, View v,
                int position, long id) {
            Map<String, String> map = (Map<String, String>) parent
                    .getItemAtPosition(position);
            Iterator<String> strInterator = map.keySet().iterator();
                  while(strInterator.hasNext()) {
                    String key=(String)strInterator.next();
                String value = (String) map.get(key);
                valueChar = parent.getItemAtPosition(position).toString();
                String temp = valueChar.replace("{Name=", "");
                valueChar = temp.substring(0, temp.indexOf(","));
                valueNum = value.replaceAll("\\s", "");
                      Log.i("mInput text1:", mInput.getText().toString());
                mInput.setText(valueNum);
                      Log.i("mInput text2:", mInput.getText().toString());
                mInput.setSelection(mInput.getText().length());
                      Log.i("mInput text3:", mInput.getText().toString());
                  }
        }
    });
}     

列表显示姓名和电话号码。当我选择一个项目时,它必须删除所有字符,只显示数字(电话号码)。这在以前的Android版本中按预期工作,但在Lolipop上,它显示了名称。从Log我可以看到valueNum获取正确的值(电话号码),但是setText以某种方式将valueNum值更改为name,因为这些日志获取了名称。 我的代码中有什么问题可能导致这种情况,或者在Android L上使用AutoComplete textView是不兼容的吗?

更新 这是日志输出。似乎命令运行2次。第一个值可以,但第二个更改。

  

I / mInput text1 :: {Phone = 6997777777,Name = Zivol} I / mInput text2 ::   6997777777 I / mInput text3 :: 6997777777 I / mInput text1 :: 699777777   I / mInput text2 :: Zivol I / mInput text3 :: Zivol

1 个答案:

答案 0 :(得分:0)

似乎问题来自&#34; replaceAll&#34;功能。这在lolipop android版本上表现不同。我最近在这里找到了这种方法: Extract digits from a string in Java

public static String stripNonDigits(
      final CharSequence input /* inspired by seh's comment */){
  final StringBuilder sb = new StringBuilder(
        input.length() /* also inspired by seh's comment */);
  for(int i = 0; i < input.length(); i++){
    final char c = input.charAt(i);
    if(c > 47 && c < 58){
      sb.append(c);
    }
  }
  return sb.toString();
}

这样我得到了正确的结果。感谢 Sean Patrick Floyd