2012-10-02 7 views
29

私は自分のアプリにAutoCompleteTextViewを持っています。このアプリはFacebook SDKを利用しています。私はこの質問のコードをSO:https://stackoverflow.com/a/12363961/450534に倣って機能している検索(フィルタリング)活動をしています。Android:オートコンプリートTextViewはFacebook Appに似ています

@シンボルが入力された後、Facebookアプリケーションのようなインラインオートコンプリートを取得するにはどうすればよいですか?問題のアクティビティはステータス更新であり、他のテキストと一緒にユーザーの友人を含むことができます。 AutoCompleteTextViewまたはEditTextは当然マルチラインのものになります。ステータスの更新については、こちらをご覧ください。

私はこの記事でコードの欠如を知っています。私はdownvotedになる危険性があります。しかし、それは実際にボイラープレートリストの標準的なフィルターコードです。

編集:Android用FriendCasterアプリも同じです。

+0

http://techdroid.kbeanie.com/2010/04/custom-autocomplete-for-android.htmlのために特定の単語 OnTextChangedListenerリスナーのアクションをクリックして指定しますアイデア ??? – Omarj

+0

これのための箱の解決策はありません、1つの方法は、Facebookのアプリを逆コンパイルすることができ、コードを参照してください。利用可能なデコンパイラはたくさんあります。しかし、彼らが基本的にやっていることは、EditText Viewを拡張し、必要に応じてカスタマイズすることです。私はツイッターが同じことをすると思います。 – Nitin

+0

@Nitin:他の人の仕事を逆コンパイルしたいとは思っていません。それに、たとえ私がそれをやろうとしていたとしても、せいぜいXMLだけを得るだろう。私が信じているJAVAは必要ではありません。 –

答えて

34

まず、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; 
    } 
}); 

ワン「の問題を」これは、ポップアップがの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。

+1

まさに私が必要なもの!魅力のように働いた。 :-) –

+0

もう1つ質問がありますか?あなたがそれに答えるかどうかにかかわらず、恩恵はあなたのものです。 –

+0

離れて尋ねる、私は答えることができる約束することはできません:) – Heinrisch

0

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

簡単な方法はmultiautocompleteのTextViewでのAndroidのTextViewとのEditTextでは、このような@usernameや#hashtagとして、リンクテキストを作成します。 、太字斜体、または下線を設定BOLD_ITALIC :リンクFacebookやInstagramの

特長

リンクを設定するための

マッチ単一の文字列または正規表現パターンは、リンクされたテキストのスタイルを設定します。リンクされたテキスト の色を変更 リンクされたテキスト はこのような何かが多分あなたが得るのを助けるLinkableEditText

関連する問題