7

EditText のテキストを複数の色にしようとしています。例えば、私の文章が「今日はいい日です」の場合、「それは」の部分を緑、残りを赤にすることはできますか?

4

5 に答える 5

7

そのようなものを使用して、色の一部を緑色にします。

final String text = "Some Text";
Spannable modifiedText = new SpannableString(text);
modifiedText.setSpan(new ForegroundColorSpan(getResources().getColor(R.color.green)), 0, lengthYouWant, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
textView.setText(modifiedText);
于 2013-01-01T21:05:14.803 に答える
5

スパナブルを使用できます。

Spannable spannable = yourText.getText();
spannable .setSpan(new BackgroundColorSpan(Color.argb(a, r, g, b)), start, end, Spannable.SPAN_INCLUSIVE_INCLUSIVE);
于 2013-01-01T21:09:49.260 に答える
2

私もこんな悩みを抱えています。数時間後、私はそれを処理する方法を見つけました:

  mYourTextView.addTextChangedListener(new TextWatcher() {

        private String oldContent = "";

        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            final String newContent = mYourTextView.getText().toString();

            if (newContent.length() > 10 && !oldContent.equals(newContent)) {
                oldContent = newContent;
                mYourTextView.setText(Html.fromHtml(
                        String.format("%s", "<font color='#000000'>" + newContent.substring(0, 10) + "</font>")
                                + "<font color='#ff0000'>" + newContent.substring(10, newContent.length()) + "</font>"));
                Log.d("onTextChanged", "Start : " + start);

                //move cursor after current character
                mYourTextView.setSelection(start + 1 > mYourTextView.getText().toString().length()
                        ? start : start + 1);

            }
        }

        @Override
        public void afterTextChanged(Editable s) {
        }
    });

このコードは、最初の 10 文字を黒色にし、その後の文字を赤色にします。EditText が setText() を呼び出してから onTextChanged を呼び出すと、無限ループを防ぐために変数 oldContent が必要になります。

于 2016-11-02T08:44:20.553 に答える
1

はい。Spannableオブジェクト ( または のいずれSpannedStringか)を作成し、SpannedStringBuilderその上にスパンを設定して、求める色を適用する必要があります。

たとえば、このサンプル プロジェクトの次のメソッドは、 の内容をTextView取得し、ユーザーが入力した文字列を検索し、すべての出現箇所を紫色の背景色でマークアップして、以前のマーカーをすべて削除します。

  private void searchFor(String text) {
    TextView prose=(TextView)findViewById(R.id.prose);
    Spannable raw=new SpannableString(prose.getText());
    BackgroundColorSpan[] spans=raw.getSpans(0,
                                             raw.length(),
                                             BackgroundColorSpan.class);

    for (BackgroundColorSpan span : spans) {
      raw.removeSpan(span);
    }

    int index=TextUtils.indexOf(raw, text);

    while (index >= 0) {
      raw.setSpan(new BackgroundColorSpan(0xFF8B008B), index, index
          + text.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
      index=TextUtils.indexOf(raw, text, index + text.length());
    }

    prose.setText(raw);
  }

あなたの場合、前景色を変更すると、 のForegroundColorSpan代わりにが使用されますBackgroundColorSpan

では、ユーザーがテキストを編集できるという点で少し注意EditTextが必要です。また、必要なルールを満たすためにフラグを選択する必要があります。たとえば、次のようにSpanned.SPAN_EXCLUSIVE_EXCLUSIVEなります。

  • スパン領域の中央に入力された文字は、スパンの効果 (前景色など) を取得します。
  • スパン領域の直前または直後に入力された文字は、スパン領域の外側と見なされるため、スパンの効果が得られません。
于 2013-01-01T21:05:17.993 に答える