Android:与Facebook应用类似的自动完成TextView

我在我的应用程序中有一个AutoCompleteTextView。 该应用程序使用Facebook的SDK。 我遵循这个问题上的代码: https : //stackoverflow.com/a/12363961/450534到点,并有一个运作的search(过滤)活动。

现在,在input@符号后,如何获得像Facebook应用程序一样的内联自动完成function,并仍保存用户键入的其他文本? 有问题的活动是针对状态更新,并可以包含用户的朋友以及其他文本。 AutoCompleteTextViewEditText自然是一个多行的。 有关状态更新,请参阅。

我知道在这篇文章中没有任何代码,所以我冒着被低估的风险,或者甚至有问题closures。 但它真的是一个标准的锅炉板过滤代码。

编辑:Android的FriendCaster应用程序也做同样的。

Solutions Collecting From Web of "Android:与Facebook应用类似的自动完成TextView"

首先让你的EditText成为一个MultiAutoCompleteTextView。 MultiAutoCompleteTextView允许您replace文本的某些部分,例如'@'之后的文本。

你可以做这样的事情:

 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; } }); 

一个“问题”是这个popup窗口会出现在EditText视图下。 要将其移动并放置在当前写入的文本下方,可以执行下面的操作:

 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可以显示更多的行,那么这当前不会处理下拉位置。

https://github.com/dhaval001/linkable_text_view.git

在Android TextView和EditText中使用多自动完成textview创build链接文本的简单方法,例如@username或#hashtag。 链接Facebook和Instagram

特征

匹配单个string或正则expression式来设置链接更改链接文本的颜色设置链接文本的样式:BOLD,ITALIC或BOLD_ITALIC设置链接文本的下划线指定特定单词的点击动作OnTextChangedListener侦听器LinkableEditText