创建一个删除文本?

我能否在 Android 中创建一个删除文本,我的意思是在 TextView标签中添加一个特殊的值,使之成为可能?

<TextView
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#040404"
android:typeface="sans"
android:textSize="12dip"
android:textStyle="bold"/>
123225 次浏览

试试这个:

richTextView = (TextView)findViewById(R.id.rich_text);


// this is the text we'll be operating on
SpannableString text = new SpannableString("Lorem ipsum dolor sit amet");


text.setSpan(new ForegroundColorSpan(Color.RED), 0, 5, 0);


// make "ipsum" (characters 6 to 11) one and a half time bigger than the textbox
text.setSpan(new RelativeSizeSpan(1.5f), 6, 11, 0);


// make "dolor" (characters 12 to 17) display a toast message when touched
final Context context = this;
ClickableSpan clickableSpan = new ClickableSpan() {
@Override
public void onClick(View view) {
Toast.makeText(context, "dolor", Toast.LENGTH_LONG).show();
}
};
text.setSpan(clickableSpan, 12, 17, 0);


// make "sit" (characters 18 to 21) struck through
text.setSpan(new StrikethroughSpan(), 18, 21, 0);


// make "amet" (characters 22 to 26) twice as big, green and a link to this site.
// it's important to set the color after the URLSpan or the standard
// link color will override it.
text.setSpan(new RelativeSizeSpan(2f), 22, 26, 0);
text.setSpan(new URLSpan("http://www.djsad.com"), 22, 26, 0);
text.setSpan(new ForegroundColorSpan(Color.GREEN), 22, 26, 0);


// make our ClickableSpans and URLSpans work
richTextView.setMovementMethod(LinkMovementMethod.getInstance());


// shove our styled text into the TextView
richTextView.setText(text, BufferType.SPANNABLE);

Paint.STRIKE _ THRU _ TEXT _ FLAG

TextView someTextView = (TextView) findViewById(R.id.some_text_view);
someTextView.setText(someString);
someTextView.setPaintFlags(someTextView.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);

对于绘制文本,有几个位标志用于执行以下操作 粗体,斜体,是的,全部删除。因此,为了使全部删除, 你需要翻转对应这面旗子的位置,最简单的 方法是对当前标志和 对应于一组标志的 启用删除标志。

编辑从 评论Something:

对于任何想要移除这面旗帜的人来说,这是如何:

someTextView.setPaintFlags(someTextView.getPaintFlags() & (~Paint.STRIKE_THRU_TEXT_FLAG));

如果你使用字符串,那真的很简单:

<string name="line"> Not crossed <strike> crossed </strike> </string>

然后就是:

<TextView
...
android:text="@string/line"
/>

我正在复制我的 回答。希望对某些人有所帮助 如果你有一个单词,我们可以使用绘制。 下面是一个例子:

<item android:state_pressed="false"><shape android:shape="line">
<stroke android:width="2dp" android:color="#ffffff" />
</shape>
</item>

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

TextView someTextView = (TextView) findViewById(R.id.some_text_view);
someTextView.setText(someString);
someTextView.setPaintFlags(someTextView.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG)

我尝试了以上几种方法,但这种方法对我最有效:

String text = "<strike><font color=\'#757575\'>Some text</font></strike>";
textview.setText(Html.fromHtml(text));

干杯

可以通过三种方式实现这一点,在 TextView中设置前景,或者设置 PaintFlag,或者在 strings.xml中将字符串声明为 <strike>your_string</strike>。比如说,

通过彩旗

这是最简单的方法,你只需要在你的 TextView 上设置删除标志,

yourTextView.setPaintFlags(Paint.STRIKE_THRU_TEXT_FLAG);

它会通过你的文本视图。

通过前景可绘制(仅适用于 API 23 +)

如果 minSdkVersion 是 API 版本23 + ,那么您可以通过将前景设置为,

<?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>

现在,你只需要在你的文本视图中将上面的可绘制图设置为 foreground,

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Your Textview with StrikeThrough"
android:foreground="@drawable/strikethrough_foreground" />  <!-- this is available above --!>

通过 strings.xml

在这个方法中,必须在 strings.xml中将字符串声明为,

<string name="strike_line"> <strike>This line is strike throughed</strike></string>

注意

但是我建议您通过设置前景可绘制来删除 TextView。因为通过可绘制,您可以很容易地设置您的直线颜色(就像我在上面的例子中设置为红色)或大小或任何其他样式属性。而在另外两种方法中,默认的文本颜色是划线颜色。

用这个就行了。 活动:

TextView t= (TextView).findViewById(R.id.thousand));
t.setPaintFlags(t.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);

对于 XML:

<RelativeLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content">


<TextView
android:id="@+id/text_view_original_cash_amount"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="5dp"
android:textColor="@android:color/darker_gray"
android:text="Rs. 1,999"/>


<View
android:layout_width="wrap_content"
android:layout_height="1dp"
android:background="@android:color/darker_gray"
android:layout_centerVertical="true"
android:layout_alignStart="@id/text_view_original_cash_amount"
android:layout_alignEnd="@id/text_view_original_cash_amount"
android:layout_alignLeft="@id/text_view_original_cash_amount"
android:layout_alignRight="@id/text_view_original_cash_amount" />
</RelativeLayout>

如果你正在使用 Kotlin:

your_text_view.apply {
paintFlags = paintFlags or Paint.STRIKE_THRU_TEXT_FLAG
text = "Striked thru text"
}

这非常适合数据绑定:

@BindingAdapter("strikethrough")
@JvmStatic
fun strikethrough(view: TextView, show: Boolean) {
view.paintFlags = if (show) {
view.paintFlags or STRIKE_THRU_TEXT_FLAG
} else {
view.paintFlags and Paint.STRIKE_THRU_TEXT_FLAG.inv()
}
}

然后在 xml 中:

    <TextView
android:id="@+id/line_item_name"
android:textAppearance="?attr/textAppearanceBody2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Club sandwich with ranch dressing"
app:strikethrough="@{viewModel.isItemChecked}"/>

在您的可观察视图模型中

fun getStrikeContent(): String {
return "Hello"
}




companion object {
@BindingAdapter("strike")
@JvmStatic
fun loadOldPrice(view: TextView, value: String) {
view.text = value
view.paintFlags = STRIKE_THRU_TEXT_FLAG
}
}

然后在 xml 中

     <TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:strike="@{itemViewModel.strikeContent}" />

科特林中,可以创建扩展属性:

inline var TextView.strike: Boolean
set(visible) {
paintFlags = if (visible) paintFlags or Paint.STRIKE_THRU_TEXT_FLAG
else paintFlags and Paint.STRIKE_THRU_TEXT_FLAG.inv()
}
get() = paintFlags and Paint.STRIKE_THRU_TEXT_FLAG == Paint.STRIKE_THRU_TEXT_FLAG

使用:

textView.strike = true

在 Kotlin:

要做的:

textView.paintFlags= textView.paintFlags or Paint.STRIKE_THRU_TEXT_FLAG

撤销:

textView.paintFlags= textView.paintFlags and Paint.STRIKE_THRU_TEXT_FLAG.inv()

正如 ABc0所建议的那样,这是 Kotlin 的延伸功能,有助于实现这一目标。

    private fun TextView.strikeThrough(shouldStrike: Boolean) {
paintFlags = if (shouldStrike) {
paintFlags or Paint.STRIKE_THRU_TEXT_FLAG
} else {
paintFlags and Paint.STRIKE_THRU_TEXT_FLAG.inv()
}
}

还有另一种方法来更改 STRIKE _ THRU _ TEXT _ FLAG 位。

它是通过获取与 TextView相关联的 Paint对象,并像下面这样使用 setStrikeThruText函数:

textView.getPaint().setStrikeThruText(/* boolean expression */);

相关文件显示:

SetFlags ()的帮助器,设置或清除 STRIKE _ THRU _ TEXT _ FLAG 位

还有设置、清除或读取其他位的功能。