You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android中能否为EditText选中文本设置删除线样式?求示例代码

在Android中给EditText选中文本添加删除线样式

当然可以啊!在Android开发里,我们完全能给EditText的选中文本设置删除线样式,核心是借助Spannable体系的API来实现——毕竟EditText的文本本身就是Editable(属于Spannable的子类),可以轻松给指定区间的文本添加样式。

下面我给你两种常见的实现方式:

方式一:点击按钮给选中的文本加删除线

这种方式比较直观,用户选中一段文本后,点击按钮就能给选中内容加上删除线,也支持再次点击取消样式。

1. 布局文件(activity_main.xml)

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="16dp">

    <EditText
        android:id="@+id/editText"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="输入文本后选中一段试试"
        android:minLines="3"/>

    <Button
        android:id="@+id/btnAddStrikeThrough"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="给选中文本加删除线"
        android:layout_marginTop="16dp"/>

</LinearLayout>

2. Kotlin实现代码

import android.os.Bundle
import android.text.Spannable
import android.text.style.StrikethroughSpan
import android.widget.Button
import android.widget.EditText
import androidx.appcompat.app.AppCompatActivity

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val editText = findViewById<EditText>(R.id.editText)
        val addStrikeBtn = findViewById<Button>(R.id.btnAddStrikeThrough)

        addStrikeBtn.setOnClickListener {
            // 获取选中文本的起止位置
            val start = editText.selectionStart
            val end = editText.selectionEnd

            // 确保确实有选中的内容(起始位置不等于结束位置)
            if (start != end) {
                val editable = editText.text
                // 先移除该区间已有的删除线,避免重复添加导致样式异常
                val existingSpans = editable.getSpans(start, end, StrikethroughSpan::class.java)
                for (span in existingSpans) {
                    editable.removeSpan(span)
                }
                // 给选中区间添加删除线样式
                editable.setSpan(
                    StrikethroughSpan(),
                    start,
                    end,
                    Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
                )
            }
        }
    }
}

3. Java实现代码

如果习惯用Java开发,这里也提供对应的版本:

import android.os.Bundle;
import android.text.Editable;
import android.text.Spannable;
import android.text.style.StrikethroughSpan;
import android.widget.Button;
import android.widget.EditText;
import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        EditText editText = findViewById(R.id.editText);
        Button addStrikeBtn = findViewById(R.id.btnAddStrikeThrough);

        addStrikeBtn.setOnClickListener(v -> {
            int start = editText.getSelectionStart();
            int end = editText.getSelectionEnd();

            if (start != end) {
                Editable editable = editText.getText();
                // 移除已有删除线
                StrikethroughSpan[] existingSpans = editable.getSpans(start, end, StrikethroughSpan.class);
                for (StrikethroughSpan span : existingSpans) {
                    editable.removeSpan(span);
                }
                // 添加删除线样式
                editable.setSpan(new StrikethroughSpan(), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
            }
        });
    }
}

方式二:实时监听选中状态自动添加删除线

如果想要用户选中文本时自动加上删除线,取消选中时移除,可以给EditText设置选中状态监听器:

Kotlin示例代码

// 在onCreate方法里添加这段代码
editText.setOnSelectionChangeListener { _, selStart, selEnd ->
    val editable = editText.text
    // 先移除所有已有的删除线(可选,根据需求调整,比如保留之前的删除线就注释这部分)
    val allSpans = editable.getSpans(0, editable.length, StrikethroughSpan::class.java)
    for (span in allSpans) {
        editable.removeSpan(span)
    }
    // 如果有选中内容,给选中区间加删除线
    if (selStart != selEnd) {
        editable.setSpan(
            StrikethroughSpan(),
            selStart,
            selEnd,
            Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
        )
    }
}

关键知识点解释

  • selectionStart和selectionEnd:用来获取EditText中选中文本的起始和结束索引,没有选中时两者相等。
  • StrikethroughSpan:Android提供的Span类,专门用于给文本添加删除线样式。
  • setSpan方法:第三个参数Spannable.SPAN_EXCLUSIVE_EXCLUSIVE表示当在该区间前后添加新文本时,删除线不会扩展到新文本上(你可以根据需求换成其他Span类型)。

内容的提问来源于stack exchange,提问作者Yesudass Moses

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 04:27:57