30

アプリにAutoCompleteTextViewがあります。アプリはFacebookSDKを利用します。私はSOでこの質問のコードをたどりました:https ://stackoverflow.com/a/12363961/450534ドットまで、機能する検索(フィルタリング)アクティビティがあります。

@記号を入力した後、Facebookアプリのようにインラインオートコンプリートを取得し、ユーザーが入力した他のテキストを保持するにはどうすればよいですか?問題のアクティビティはステータス更新用であり、他のテキストとともにユーザーの友達を含めることができます。AutoCompleteTextViewまたははEditText当然複数行になります。ステータスの更新については、が表示されます。

この投稿にコードがないことを知っているので、反対票を投じたり、質問を閉じたりするリスクがあります。しかし、それは実際には標準的なボイラープレートリストフィルタリングコードです。

編集:Android用のFriendCasterアプリも同じことをします。

4

2 に答える 2

36

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

これに関する1つの「問題」は、ポップアップが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) {
  }
});

注:現在、エディットテキストに表示できる行数よりも多くの行がエディットテキストにある場合、これはドロップダウン位置を処理しません。

于 2012-10-09T08:27:54.953 に答える
0

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

マルチオートコンプリートテキストビューを使用して、AndroidTextViewおよびEditTextで@usernameや#hashtagなどのリンクテキストを作成する簡単な方法。FacebookとInstagramをリンクする

特徴

単一の文字列または正規表現パターンを一致させてリンクを設定するリンクされたテキストの色を変更するリンクされたテキストのスタイルを設定する:BOLD、ITALIC、またはBOLD_ITALICリンクされたテキストの下線を設定する特定の単語のクリックアクションを指定するLinkableEditTextのOnTextChangedListenerリスナー

于 2016-03-01T12:59:26.793 に答える