web-dev-qa-db-ja.com

スパンおよびスパン可能なテキストに関する例はありますか

EditTextとSpannableテキストオブジェクトの使用に苦労しています。最近では、APIドキュメントを10回ほど読んでいますが、正しく理解しているかどうかはわかりません。それで、私はEditTextとSpannableを使用する方法を示す一種の例を探しています。

28
skysign

APIから把握できないものを指定しないため、質問に答えることは困難です(短い答え:質問を一般的な質問ではなく特定の質問に書き直してください)。

典型的なSpannableの例は、EditTextで選択されたテキストをイタリックに変換する次のようなものです。

Spannable str = mBodyText.getText(); 
if(mBodyText.getSelectionEnd() > mBodyText.getSelectionStart()) 
  str.setSpan(new StyleSpan(Android.graphics.Typeface.ITALIC),  
                      mBodyText.getSelectionStart(), mBodyText.getSelectionEnd(),  
                      Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
else
  str.setSpan(new StyleSpan(Android.graphics.Typeface.ITALIC),
              mBodyText.getSelectionEnd(),
              mBodyText.getSelectionStart(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

これは別のものからカットアンドペーストされているため、直接貼り付け性が損なわれた可能性がありますが、少なくともSpannable(この場合はStyleSpan)の実際の例を示しています。 APIでは、他のタイプのスパン(特にImageSpan、これは新しく変換されたドロイダーの間でよくある質問です)を見つけることができます。

32
andy

私もそれを理解しようとし始めたばかりで、それは不必要にトリッキーなようです。

これは、新しいスパン可能なテキストを既存のビューに追加するための実用的な方法です。色付きのテキストをビューに追加したかったのですが、これが唯一の方法のように思えました。

醜いハックのように感じられますが、ダミーのTextView(どこにも表示されていません)を作成してテキストのスタイルを設定し、そのスタイル付きテキストを好きな場所に追加できます。クレジットはanddev.orgのiifuzzに寄付されます。私のコードは次のようになります:

    spanbuffer = new TextView(context);
    spanbuffer.setText(newText, TextView.BufferType.SPANNABLE);
    Spannable s = (Spannable) spanbuffer.getText();
    s.setSpan(new ForegroundColorSpan(Color.RED), 0, newText.length() - 1, 0);
    this.append(s);

次のように、SpannableFactoryを使用して新しいスパン可能なテキストを作成できるはずです。

    Spannable s = Spannable.Factory.getInstance().newSpannable(newText);

しかし、このテキストで実際に新しいスパン効果を表示することができなかったので、あきらめました。

10
Sam L.