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
相关产品推荐
相关产品推荐

