删除Android小部件中的文本子字符串

Posted

技术标签:

【中文标题】删除Android小部件中的文本子字符串【英文标题】:Strike through substring of text in Android widget 【发布时间】:2016-06-15 21:25:24 【问题描述】:

我的 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);

问题是这会穿透文本视图中的所有文本。如何仅删除文本视图的部分文本?

【问题讨论】:

也许使用SpannableStringBuilderStrikethroughSpan。这对于您自己的应用程序中的TextView 可以正常工作;我没有尝试通过RemoteViews 传递Spanned 对象。 我认为在处理小部件时必须使用远程视图,因此跨度不起作用,或者至少我找不到将跨度应用于远程视图的方法。 setTextViewText() 接受CharSequence,这通常意味着它接受SpannableStringBuilder 哇。我觉得很笨。谢谢,这绝对有效。我在这方面工作了很长时间,以至于我完全忽略了它。 【参考方案1】:

使用SpannableStringBuilder 和StrikethroughSpan

例如要获得以下效果,请参见下面的 sn -p:


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);

更多炫酷效果 here

【讨论】:

我认为这行不通。你用小部件测试过这个吗?我很确定您必须使用远程视图。我无法直接访问文本视图。 好的,我明白了...让我检查一下 如何更改笔触颜色? ForegroundColorSpan 更改文本颜色。【参考方案2】:

Xoce 的答案非常正确,但它更像是应用程序文本视图的一般答案,但通过一些调整,我可以为小部件做到这一点。 (也感谢 CommonsWare 将我推向正确的方向。

在 updateAppWidget 方法中,您可以使用远程视图将文本添加到 textview。要自定义带有删除线的文本视图文本的子字符串,请使用可跨度字符串构建器(您也可以使用不同的跨度来实现粗体、下划线、斜体等)

这就是我所做的:

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);

    ...


【讨论】:

以上是关于删除Android小部件中的文本子字符串的主要内容,如果未能解决你的问题,请参考以下文章

sql server 里类似replace的字符串子串删除

PB中取字符串子串的函数是啥

PB中取字符串子串的函数是啥

如何从 Android 中的 RemoteViews 中删除小部件?

华为OD机试真题Java实现判断字符串子序列真题+解题思路+代码(2022&2023)

Android小部件onReceive崩溃