0

このようなカスタムAutoCompleteViewを作成したいと思います。

ここに画像の説明を入力してください

特殊文字が追加されたときに入力する必要があります(Facebookなど。@ Bと入力すると、「B」で始まる名前のすべての友達が入力され、名前を選択できます)。

'@'が追加されるまで、入力中に入力しないでください。

'@'を追加すると、autocompleteviewがドロップダウンされ、名前を選択できます。選択すると、名前が追加されます。

ここに画像の説明を入力してください

私はこれを見つけましが、満足していません。手がかりが必要です。それらは実装されています...「@」ドロップダウンを入力したときのように、データが入力されます。しかし、さらにカスタマイズする必要があります。他の人がアイデアや不完全な情報源を持っている場合、今私は助けが必要です。

自分で試してみる必要がありますが、時間を節約するために、customviewを実装する前に質問させてください。

4

2 に答える 2

2

クラスを拡張してカスタムautocompleteviewを作成する必要があります。変更するには、質問に記載されているコードを使用してください。

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

}

これがお役に立てば幸いです...

于 2013-03-06T12:20:17.010 に答える
0

これは、を使用して実現できますMultiAutoCompleteTextViewTokenizer独自のクラスを実装するだけで機能します。言及のために、私はあなたがそれを使うことができるクラスを書きました。

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

できます。

于 2015-08-04T17:18:42.243 に答える