【问题标题】:Custom AutoCompletevView like facebook comments field in android自定义 AutoCompletevView,如 android 中的 facebook 评论字段
【发布时间】:2015-08-05 01:40:02
【问题描述】:
我想像这样制作自定义 AutoCompleteView..
添加我的特殊字符时应该填充它(例如 facebook.. 当您键入 @B 时,所有名称以“B”开头的朋友都将被填充,我们可以选择名称)。
在添加“@”之前,不应在键入时填充它。
当添加'@'时,自动完成视图被下拉,我们可以选择名称,选择后将被追加。
我找到了this,但不满意。我需要线索。他们已经实现了......就像你输入'@'下拉填充时一样。但我必须自定义更多。现在,如果其他人有想法或任何未完成的来源,我需要帮助。
我必须自己尝试,但在实施 customview 之前让我问一下以节省我的时间。
【问题讨论】:
标签:
android
autocomplete
android-custom-view
autocompletetextview
【解决方案1】:
您必须通过扩展类来制作自定义自动完成视图......并且您的问题中提到的代码将被更改。
public class CustomAutoComplete extends AutoCompleteTextView {
private String previous = "";
private String seperator = "@";
boolean isState = false;
public CustomAutoComplete(final Context context, final AttributeSet attrs,
final int defStyle) {
super(context, attrs, defStyle);
this.setThreshold(1);
}
public CustomAutoComplete(final Context context, final AttributeSet attrs) {
super(context, attrs);
this.setThreshold(1);
}
public CustomAutoComplete(final Context context) {
super(context);
this.setThreshold(1);
}
/**
* This method filters out the existing text till the separator and launched
* the filtering process again
*/
@Override
protected void performFiltering(final CharSequence text, final int keyCode) {
String filterText = text.toString().trim();
String lastchar = filterText.substring(filterText.length() - 1,
filterText.length());
if (filterText.length() == 1) {
if (lastchar.equals(seperator)) {
isState = true;
} else {
isState = false;
}
}
previous = filterText.substring(0,
filterText.lastIndexOf(getSeperator()) + 1);
filterText = filterText.substring(filterText
.lastIndexOf(getSeperator()) + 1);
if ((lastchar.equals(seperator)) || isState) {
super.performFiltering(filterText, keyCode);
isState = true;
}
}
/**
* After a selection, capture the new value and append to the existing text
*/
@Override
protected void replaceText(final CharSequence text) {
isState = false;
super.replaceText(previous + text);// + getSeperator());
}
public String getSeperator() {
return seperator;
}
public void setSeperator(final String seperator) {
this.seperator = seperator;
}
}
希望对你有所帮助...
【解决方案2】:
您可以使用MultiAutoCompleteTextView 实现此目的。只需实现您自己的 Tokenizer 类即可。对于提及我已经写了一个类,你可以使用它。
package howdysam.com.howdysuggesttext;
import android.text.SpannableString;
import android.text.Spanned;
import android.text.TextUtils;
import android.widget.MultiAutoCompleteTextView;
public class AtTokenizer implements MultiAutoCompleteTextView.Tokenizer {
@Override
public int findTokenStart(CharSequence text, int cursor) {
int i = cursor;
while (i > 0 && text.charAt(i - 1) != '@') {
i--;
}
while (i < cursor && text.charAt(i) == '@') {
i++;
}
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;
}
@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;
}
}
}
}
然后在视图部分(活动或片段)而不是做
edit.setTokenizer(new MultiAutoCompleteTextView.CommaTokenizer());
关注
edit.setTokenizer(new AtTokenizer());
有效。