是否有一种简单的方法可以在app小部件中显示文本?

Ant*_*nio 132 android widget textview strikethrough

我想知道是否有一种简单的方法可以在Android中的app小部件中查看文本.在正常活动中,使用textview标记非常简单:

textView.setPaintFlags(textView.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);
Run Code Online (Sandbox Code Playgroud)

但是因为在app小部件中,我只能使用远程视图...我不知道这是否可行

有人知道这个吗?

谢谢!

ruh*_*lde 180

在textview中以编程方式执行此操作,在其他视图中未经测试>>

TextView tv = (TextView) findViewById(R.id.mytext);
tv.setText("This is strike-thru");
tv.setPaintFlags(tv.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);
Run Code Online (Sandbox Code Playgroud)

  • 这对于App-Widgets是不可能的.它们只能与RemoteViews一起使用,并且没有方法可以读取绘制标记. (11认同)

BoD*_*BoD 78

另一种以编程方式执行此操作的方法,它看起来有点像黑客而不是Paint方式:

而不是做:

tv.setText(s);
Run Code Online (Sandbox Code Playgroud)

做:

private static final StrikethroughSpan STRIKE_THROUGH_SPAN = new StrikethroughSpan();
...
tv.setText(s, TextView.BufferType.SPANNABLE);
Spannable spannable = (Spannable) tv.getText();
spannable.setSpan(STRIKE_THROUGH_SPAN, 0, s.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
Run Code Online (Sandbox Code Playgroud)


ohh*_*rob 60

2015年更新:伙计们,这适用于Android的旧版本.查看现代解决方案的其他答案!


要浏览整个文本视图,您可以使用特定的背景图像来模拟删除线效果:

android:background="@drawable/bg_strikethrough"
Run Code Online (Sandbox Code Playgroud)

bg_strikethrough可绘制的是9个贴片的情况下,通过中间保持实线,在任何一侧生长,无论你认为多少填充是合理的.我用过这样的一个:

替代文字

(为了清晰起见,放大了...... 1300%!)

替代文字

这是我的HDPI版本,所以保存它(第一个http://i.stack.imgur.com/nt6BK.png),res/drawable-hdpi/bg_strikethrough.9.png配置将如下:

替代文字

  • 这只适用于单行文本. (12认同)

agi*_*llo 60

你可以用这个:

remoteviews.setInt(R.id.YourTextView, "setPaintFlags", Paint.STRIKE_THRU_TEXT_FLAG | Paint.ANTI_ALIAS_FLAG);
Run Code Online (Sandbox Code Playgroud)

当然你也可以从android.graphics.Paint类中添加其他标志.

  • 不知道这怎么没有得到更多的选票,它完全回答了这个问题.谢谢. (6认同)
  • 首先不清楚什么是 remoteviews ,加上不适用于所有 android 版本。 (4认同)

pav*_*vel 22

为此,您可以使用此功能

 title.setPaintFlags(title.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);
Run Code Online (Sandbox Code Playgroud)

并删除你可以使用它

 title.setPaintFlags(title.getPaintFlags() & (~Paint.STRIKE_THRU_TEXT_FLAG));
Run Code Online (Sandbox Code Playgroud)


Aks*_*dam 20

如果你只有一个单词,我们可以使用drawable.以下是示例:

<item android:state_pressed="false"><shape android:shape="line">
        <stroke android:width="2dp" android:color="#ffffff" />
    </shape>
</item>
Run Code Online (Sandbox Code Playgroud)

如果您有多行,则可以使用以下代码:

TextView someTextView = (TextView) findViewById(R.id.some_text_view);
someTextView.setText(someString);
someTextView.setPaintFlags(someTextView.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG)
Run Code Online (Sandbox Code Playgroud)


Mic*_*ael 19

这是所有 Kotlin 人的扩展

fun TextView.showStrikeThrough(show: Boolean) {
    paintFlags =
            if (show) paintFlags or Paint.STRIKE_THRU_TEXT_FLAG
            else paintFlags and Paint.STRIKE_THRU_TEXT_FLAG.inv()
}
Run Code Online (Sandbox Code Playgroud)

用法

textView.showStrikeThrough(true)
Run Code Online (Sandbox Code Playgroud)

局限性

删除线只能与文本颜色相同

(即红色文字和蓝色删除线是不可能的)


d-f*_*erx 12

制作一个可绘制文件, striking_text.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="false">
        <shape android:shape="line">
            <stroke android:width="1dp" android:color="@android:color/holo_red_dark" />
        </shape>
    </item>
</selector>
Run Code Online (Sandbox Code Playgroud)

布局 XML

 <TextView
            ....
            ....
            android:background="@drawable/striking_text"
            android:foreground="@drawable/striking_text"
            android:text="69$"
           />
Run Code Online (Sandbox Code Playgroud)

如果您低于 API 级别 23 的最低 SDK 仅使用背景 仅将背景和前景放在 Textview 中,则 android studio 将显示一条错误,指出为 API >23 创建布局文件,然后删除 android :foreground="@主布局中的“drawable/stricking_text”

输出看起来像这样: 在此输入图像描述


小智 10

对于多行TextView,您应该使用android.text.style.CharacterStyle,如下所示:

SpannableString spannable = new SpannableString(text);
spannable.setSpan(new StrikethroughSpan(), 0, text.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
remoteViews.setTextViewText(R.id.itemText, spannable);
Run Code Online (Sandbox Code Playgroud)


Ign*_*rre 8

如果你使用字符串真的很容易:

<string name="line"> Not crossed <strike> crossed </strike> </string>
Run Code Online (Sandbox Code Playgroud)

然后就是:

<TextView 
        ...
         android:text="@string/line"
 />
Run Code Online (Sandbox Code Playgroud)

  • @war_Hero为我工作,虽然没有在Android Studio的渲染器中渲染.不得不真正建立它看到它. (4认同)
  • 在模拟器/设备中运行时工作. (2认同)
  • 它适用于我..你只能在设备或模拟器上输出...不在预览中.. (2认同)

Cha*_*ddy 8

添加以下行: -

TextView tv=(TextView) v.findViewById(android.R.id.text1);
tv.setPaintFlags(tv.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);
Run Code Online (Sandbox Code Playgroud)

使用你的参考而不是"电视"


小智 6

试试这个代码

textview.setText((Html.fromHtml("<strike>hello world!</strike>")));
Run Code Online (Sandbox Code Playgroud)