web-dev-qa-db-ja.com

TextViewテキストのセクションに「取り消し線」を指定する

Webサービスからのテキストブロックがあり、事前定義したいくつかのタグに応じて、TextViewに設定する前にテキストのスタイルを設定します。太字、斜体、下線の場合、replaceAllコマンドを使用してこれを簡単に行うことができました。

PageText = PageText.replaceAll("\\*([a-zA-Z0-9]+)\\*", "<b>$1</b>");
        PageText = PageText.replaceAll("=([a-zA-Z0-9]+)=", "<i>$1</i>");            
        PageText = PageText.replaceAll("_([a-zA-Z0-9]+)_", "<u>$1</u>");
txtPage.setText(Html.fromHtml(PageText), TextView.BufferType.SPANNABLE);

したがって、Wordを太字にするには、*で囲みます。イタリック体の場合は、_で囲みます。

ただし、取り消し線の場合、Html.fromHtmlは「取り消し線」タグをサポートしていないため、同じ方法で行うことはできません。 Spannableを使用してテキストの1つのセクションにスタイルを設定する例を見てきましたが、位置番号が必要です。したがって、テキストをループして-(ストライキを表すタグ)を検索し、次のテキストを検索して、その間にテキストを広げ、そのようなすべての文字列について繰り返すことができると思います。他の1行ではなく、10行のループコードになるので、もっとエレガントな解決策があるかどうか疑問に思っています。

31
RMS2

TextViewのみの場合は、ペイントフラグを使用して取り消し線を引くことができます。

TextView tv=(TextView) v.findViewById(Android.R.id.text1);
tv.setPaintFlags(tv.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);
93
Suresh

@Sureshソリューションは、TextView全体に取り消し線を付けたい場合に機能しますが、テキストの一部のみに取り消し線を付けたい場合は、以下のコードを使用します。

    tvMRP.setText(text, TextView.BufferType.SPANNABLE);
    Spannable spannable = (Spannable) tvMRP.getText();
    spannable.setSpan(new StrikethroughSpan(), 3, text.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

ここでtextは、TextViewに表示するテキストです3はノーです。取り消し線の開始位置(0から始まる)の文字。

32
Rohan Kandwal

これは、Html.fromHtml()に渡す必要があるカスタムTagHandlerを使用したソリューションです。

Android:Html.TagHandlerの使用方法

1
Ridcully

次のようなカスタムTagHandlerでそれを行うことができます これについてSO質問

Spanned parsed = Html.fromHtml(PageText, null, new MyHtmlTagHandler());

そしてTagHandlerはメソッドを実装します:

public void handleTag(boolean opening, String tag, Editable output,
        XMLReader xmlReader) {
    if(tag.equalsIgnoreCase("strike") || tag.equals("s")) {
        processStrike(opening, output);
    }
}
....
1
Marcelo

これは実際にはサポートされていないようです。少なくとも、Android 3.1では機能しません。

@ RMS2テキストが小さい場合は、2つまたは3つの個別のテキストビューに分割し、必要なものにのみフラグを適用できます。長いテキストには最適ではありません;(

0

Html.fromHtml<strike>をサポートしていませんか?これは Commonswareブログの投稿 に記載されています

0
Wayne