Android:类似于Facebook应用程序的自动完成文本视图

Android:类似于Facebook应用程序的自动完成文本视图,android,android-listview,autocompletetextview,Android,Android Listview,Autocompletetextview,我的应用程序中有一个AutoCompleteTextView。该应用程序使用Facebook SDK。我遵循了这个问题的代码,所以:到了点,有一个功能性的搜索(过滤)活动 现在,在输入@符号后,我如何获得像Facebook应用程序一样的内联自动完成,并且仍然保留用户输入的其他文本?讨论中的活动用于状态更新,可以包含用户的好友以及其他文本。AutoCompleteTextView或EditText自然是多行的。有关状态更新,请参见 我知道,由于这篇文章中没有任何代码,我有可能被否决,甚至可能让问题

我的应用程序中有一个AutoCompleteTextView。该应用程序使用Facebook SDK。我遵循了这个问题的代码,所以:到了点,有一个功能性的搜索(过滤)活动

现在,在输入@符号后,我如何获得像Facebook应用程序一样的内联自动完成,并且仍然保留用户输入的其他文本?讨论中的活动用于状态更新,可以包含用户的好友以及其他文本。
AutoCompleteTextView
EditText
自然是多行的。有关状态更新,请参见

我知道,由于这篇文章中没有任何代码,我有可能被否决,甚至可能让问题结束。但它实际上是一个标准的锅炉板列表过滤代码


编辑:Android的FriendCaster应用程序也有同样的功能。

首先将您的EditText设置为MultiAutoCompleteTextView。MultiAutoCompleteTextView允许您替换文本的某些部分,例如“@”之后的文本

您可以这样做:

final MultiAutoCompleteTextView inputEditText = (MultiAutoCompleteTextView) dialog.findViewById(R.id.MyEditText);

String[] COUNTRIES = new String[] { "Belgium", "France", "Italy", "Germany", "Spain" };
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_dropdown_item_1line, COUNTRIES);
inputEditText.setAdapter(adapter);
inputEditText.setThreshold(1); //Set number of characters before the dropdown should be shown

//Create a new Tokenizer which will get text after '@' and terminate on ' '
inputEditText.setTokenizer(new Tokenizer() {

  @Override
  public CharSequence terminateToken(CharSequence text) {
    int i = text.length();

    while (i > 0 && text.charAt(i - 1) == ' ') {
      i--;
    }

    if (i > 0 && text.charAt(i - 1) == ' ') {
      return text;
    } else {
      if (text instanceof Spanned) {
        SpannableString sp = new SpannableString(text + " ");
        TextUtils.copySpansFrom((Spanned) text, 0, text.length(), Object.class, sp, 0);
        return sp;
      } else {
        return text + " ";
      }
    }
  }

  @Override
  public int findTokenStart(CharSequence text, int cursor) {
    int i = cursor;

    while (i > 0 && text.charAt(i - 1) != '@') {
      i--;
    }

    //Check if token really started with @, else we don't have a valid token
    if (i < 1 || text.charAt(i - 1) != '@') {
      return cursor;
    }

    return i;
  }

  @Override
  public int findTokenEnd(CharSequence text, int cursor) {
    int i = cursor;
    int len = text.length();

    while (i < len) {
      if (text.charAt(i) == ' ') {
        return i;
      } else {
        i++;
      }
    }

    return len;
  }
});
inputEditText.addTextChangedListener(new TextWatcher() {

  @Override
  public void onTextChanged(CharSequence s, int start, int before, int count) {
    Layout layout = inputEditText.getLayout();
    int pos = inputEditText.getSelectionStart();
    int line = layout.getLineForOffset(pos);
    int baseline = layout.getLineBaseline(line);

    int bottom = inputEditText.getHeight();

    inputEditText.setDropDownVerticalOffset(baseline - bottom);

  }

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

  @Override
  public void afterTextChanged(Editable s) {
  }
});
注意:如果edittext中的行数超过了edittext所能显示的行数,则当前不考虑下拉位置。

在Android TextView和带有multiautocomplete TextView的EditText中创建链接文本的简单方法,如@username或#hashtag。链接facebook和instagram

特征

匹配单个字符串或正则表达式模式以设置链接 更改链接文本的颜色 设置链接文本的样式:粗体、斜体或粗体-斜体 设置链接文本的下划线 指定特定单词的单击操作
ContextChangedListener listener for LinkableEditText

类似的内容可能会帮助您了解这个想法???没有现成的解决方案,一种方法是您可以反编译Facebook应用程序并查看代码。有很多反编译器可用。但是他们基本上是在扩展EditText视图,并根据需要定制它。我认为twitter也有同样的功能。@Nitin:我不完全确定我是否愿意去编译别人的作品。此外,即使我这样做,充其量也只能得到他们的XML。不是他们的JAVA,我相信这是必要的。@SkiddharD为了它的价值,你会得到明文版的JAVA,我知道,因为我做到了。这正是我所需要的!工作很有魅力。:-)我可以再问一个问题吗?不管你是否回答,赏金都是你的。尽管去问,但我不能保证我能回答:)哈哈。。。没问题。在我目前的计划中,我从Facebook API中获取数据。我需要做什么样的更改才能适应实现
BaseAdapter
的适配器?您需要使其实现可过滤。然后重写getFilter(),您可以查看一个示例。然后在ArrayFilter中,您可能还希望覆盖ConvertResultString(对象resultValue)。