1. ホーム
  2. android

[解決済み] SPAN_EXCLUSIVE_EXCLUSIVEなどのSpanフラグの意味を教えてください。

2023-06-06 19:30:36

質問

どなたか、例題を挙げて明確に説明してください。 スパンフラグ のように SPAN_EXCLUSIVE_EXCLUSIVESPAN_MARK_MARK の意味と、どのような場合にどのようなフラグを使用するのか?

公式ドキュメントに書いてあることがよくわかりません。

型のスパン SPAN_EXCLUSIVE_EXCLUSIVE というタイプのスパンは、始点または終点に挿入されたテキストを含むように拡張されません。 挿入されることはありません。

expand to include"は、スパンを挿入した後に行われた編集を指すのでしょうか?

これらのフラグは、不変テキストを持つSpannablesには影響しないということでしょうか?

どのように解決するのですか?

フラグが意味しないこと

私が最初に INCLUSIVEEXCLUSIVE の部分は Spannable フラグは、スパンの開始と終了のインデックス位置を含むかどうかを示すだけだと思っていました。しかし、そうではありません。次の例でそれを説明しよう。

String myString = "01234";
int start = 1;
int end = 3;
int spanFlag = Spannable.SPAN_INCLUSIVE_INCLUSIVE; // this is what is changing

SpannableString spannableString = new SpannableString(myString);
ForegroundColorSpan foregroundSpan = new ForegroundColorSpan(Color.RED);
spannableString.setSpan(foregroundSpan, start, end, spanFlag);
textView.setText(spannableString);

以下はその結果です。

SPAN_INCLUSIVE_INCLUSIVE

SPAN_INCLUSIVE_EXCLUSIVE

SPAN_EXCLUSIVE_INCLUSIVE

SPAN_EXCLUSIVE_EXCLUSIVE

これらはすべて同じです! フラグはスパンに影響を与えません。 スパン は常に はその開始インデックスにある文字を含み、終了インデックスにある文字を除外します。

フラグが意味するもの

この INCLUSIVEEXCLUSIVE の部分は、実際にはスパナブル・フラッグの であるテキストをスパンが含むべきかどうかを示します。 挿入される であるテキストを含めるかどうか。 .

以下は、それを説明するための修正例です。

String myString = "01234";
int start = 1;
int end = 3;
int spanFlag = Spannable.SPAN_INCLUSIVE_INCLUSIVE; // this is what is changing

// set the span
SpannableStringBuilder spannableString = new SpannableStringBuilder(myString);
ForegroundColorSpan foregroundSpan = new ForegroundColorSpan(Color.RED);
spannableString.setSpan(foregroundSpan, start, end, spanFlag);

// insert the text after the span has already been set
// (inserting at start index second so that end index doesn't get messed up)
spannableString.insert(end, "x");
spannableString.insert(start, "x");

textView.setText(spannableString);

を挿入した結果は以下の通りです。 x を挿入した結果です。

SPAN_INCLUSIVE_INCLUSIVE

SPAN_INCLUSIVE_EXCLUSIVE

SPAN_EXCLUSIVE_INCLUSIVE

SPAN_EXCLUSIVE_EXCLUSIVE

注意事項

  • 2つ目の例では SpannableStringBuilder の中のテキストは SpannableString のテキストは不変なので、そこにテキストを挿入することはできません。したがって、フラグは一般に SpannableString . しかし、例えば SpannableString にコピーされ SpannableStringBuilder または Editable であり、そこからフラグが意味を持つことになります。
  • この回答を見る との違いについては SpannableString , SpannableStringBuilder , Editable などがあります。