Зачеркнуть подстроку текста в виджете Android

У меня есть текстовое представление в моем виджете Android, и мне нужно зачеркнуть только определенные строки текста. Я нашел это в другом вопросе SO, чтобы вычеркнуть текст в виджете:

RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.new_app_widget);

// strike through text, this strikes through all text
views.setInt(R.id.appwidget_text, "setPaintFlags", Paint.STRIKE_THRU_TEXT_FLAG | Paint.ANTI_ALIAS_FLAG);

Проблема в том, что это вычеркивает весь текст в текстовом представлении. Как я могу зачеркнуть только часть текста текстового представления?


person Mikkel Bang    schedule 02.03.2016    source источник
comment
Возможно, используйте SpannableStringBuilder и StrikethroughSpan. Это отлично подойдет для TextView в вашем собственном приложении; Я не экспериментировал с передачей Spanned объектов через RemoteViews.   -  person CommonsWare    schedule 02.03.2016
comment
Я думаю, вам нужно использовать удаленные представления при работе с виджетом, поэтому интервалы не будут работать, или, по крайней мере, я не могу найти способ применить интервал к удаленному представлению.   -  person Mikkel Bang    schedule 03.03.2016
comment
setTextViewText() принимает CharSequence, что обычно означает, что принимает SpannableStringBuilder.   -  person CommonsWare    schedule 03.03.2016
comment
Вот это да. Я чувствую себя тупым. Спасибо, что определенно сработало. Я занимаюсь этим так долго, что совершенно не заметил этого.   -  person Mikkel Bang    schedule 03.03.2016


Ответы (2)


Используйте SpannableStringBuilder и StrikethroughSpan

Например, чтобы получить следующий эффект, см. Фрагмент ниже:  введите описание изображения здесь


String firstWord = "Hello";
String secondWord = "World!";

TextView tvHelloWorld = (TextView)findViewById(R.id.tvHelloWorld);

// Create a span that will make the text red
ForegroundColorSpan redForegroundColorSpan = new ForegroundColorSpan(
    getResources().getColor(android.R.color.holo_red_dark));

// Use a SpannableStringBuilder so that both the text and the spans are mutable
SpannableStringBuilder ssb = new SpannableStringBuilder(firstWord);

// Apply the color span
ssb.setSpan(
    redForegroundColorSpan,            // the span to add
    0,                                 // the start of the span (inclusive)
    ssb.length(),                      // the end of the span (exclusive)
    Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // behavior when text is later inserted into the SpannableStringBuilder
                                       // SPAN_EXCLUSIVE_EXCLUSIVE means to not extend the span when additional
                                       // text is added in later

// Add a blank space
ssb.append(" ");

// Create a span that will strikethrough the text
StrikethroughSpan strikethroughSpan = new StrikethroughSpan();

// Add the secondWord and apply the strikethrough span to only the second word
ssb.append(secondWord);
ssb.setSpan(
    strikethroughSpan,
    ssb.length() - secondWord.length(),
    ssb.length(),
    Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

// Set the TextView text and denote that it is Editable
// since it's a SpannableStringBuilder
tvHelloWorld.setText(ssb, TextView.BufferType.EDITABLE);

другие интересные эффекты здесь

person ΦXocę 웃 Пepeúpa ツ    schedule 02.03.2016
comment
Я не думаю, что это сработает. Вы тестировали это с виджетами? Я почти уверен, что вам нужно использовать удаленные просмотры. У меня нет прямого доступа к текстовому представлению. - person Mikkel Bang; 02.03.2016
comment
Хорошо, я понял ... позволь мне проверить это - person ΦXocę 웃 Пepeúpa ツ; 02.03.2016
comment
Как изменить цвет обводки? ForegroundColorSpan изменяет цвет текста. - person us2956; 31.10.2018

Ответ Xoce в значительной степени правильный, но это был скорее общий ответ для текстовых представлений приложений, но с некоторыми настройками у меня есть способ сделать это для виджетов. (Также спасибо CommonsWare за то, что подтолкнули меня в правильном направлении.

В методе updateAppWidget вы можете добавлять текст в текстовое представление с помощью удаленных представлений. Чтобы настроить подстроки текста текстового представления с зачеркиванием, используйте построитель составных строк (вы также можете использовать разные интервалы для получения полужирного шрифта, подчеркивания, курсива и т. Д.)

Вот что я сделал:

static void updateAppWidget(Context context, AppWidgetManager appWidgetManager,
                            int appWidgetId) {
    CharSequence widgetText = NewAppWidgetConfigureActivity.loadTitlePref(context, appWidgetId, NewAppWidgetConfigureActivity.TEXT_KEY);
    // Construct the RemoteViews object
    RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.new_app_widget);

    SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder(widgetText);
    StrikethroughSpan strikethroughSpan = new StrikethroughSpan();

    spannableStringBuilder.setSpan(strikethroughSpan, startIndex, endIndex, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
    views.setTextViewText(R.id.appwidget_text, spannableStringBuilder);

    ...

}
person Mikkel Bang    schedule 02.03.2016