java.lang.IndexOutOfBoundsException: setSpan ( 0...x ) ends beyond length X

news2024/9/21 11:02:09

1,可能是EditText,setSelection(x)时超过了 输入框内容的实际长度导致的。

2,手机开启“拼写检查功能”,EditText设置了最大长度,选择提示的某一项文案时超过设置的最大长度限制,导致崩溃。

针对情况2 开启“拼写检查功能” 的举例:

例如,通过InputFilter 或者maxLength 设置了EditText的最大长度为8。

↑ 此时已经输入了7位

↑ 再输入一个空格,此时已经达到最大长度8。

但已经输入的字符有红色横线,显示可以进行提示,点击已输入的字符就会展示下方样式。

此时如果选择“Que tak”是没问题的,因为没有达到最大长度限制。
但选择“quest nak”就会崩溃,报IndexOutOfBoundsException。。


解决办法:
给对应的editText 设置 :setInputType(InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS)。

-------------------------------------------------------------------------------------------------------------------------------

原因:
参考原文:java.lang.IndexOutOfBoundsException: setSpan ( ... ) ends beyond length 剖析

看trackstack的信息,应该是点击其中一项候选词的时候发生的奔溃。让我们先看看SuggesttionsPopupWindow在处理点击事件的时候做了什么。

@Override
 public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
     SuggestionInfo suggestionInfo = mSuggestionInfos[position];
     replaceWithSuggestion(suggestionInfo);
     hideWithCleanUp();
}

代码很简洁,我们继续看看replaceWithSuggestion这个方法,代码挺长的,只保留重点

private void replaceWithSuggestion(@NonNull final SuggestionInfo suggestionInfo) {
    ···
    //suggestion是点击选中的候选词
	final String suggestion = suggestionInfo.mText.subSequence(
		suggestionStart, suggestionEnd).toString();
	//替换
	mTextView.replaceText_internal(spanStart, spanEnd, suggestion);

	//把被替换的词放到候选词列表
	String[] suggestions = targetSuggestionSpan.getSuggestions();
	suggestions[suggestionInfo.mSuggestionIndex] = originalText;

	// Restore previous SuggestionSpans
	//候选词和被替换词的长度差值
	final int lengthDelta = suggestion.length() - (spanEnd - spanStart);
	for (int i = 0; i < length; i++) {
	// Only spans that include the modified region make sense after replacement
	// Spans partially included in the replaced region are removed, there is no
	// way to assign them a valid range after replacement
		if (suggestionSpansStarts[i] <= spanStart && suggestionSpansEnds[i] >= spanEnd) {
			//这里在计算setSpan_internal的时候end加上了候选词和被替换词的长度差值,其实就是默认
			//候选词替换后可以完全显示,假如我们设置了长度限制,例如maxlength,就会引发上述的奔溃
			mTextView.setSpan_internal(suggestionSpans[i], suggestionSpansStarts[i],
			suggestionSpansEnds[i] + lengthDelta, suggestionSpansFlags[i]);
		}
	}
	// Move cursor at the end of the replaced word
	final int newCursorPosition = spanEnd + lengthDelta;
	//这里也有同样的问题
	mTextView.setCursorPosition_internal(newCursorPosition, newCursorPosition);
}

另:

拼写检查的设置位置:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2114037.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【电子通识】洁净度等级划分及等级标准

洁净度常用于评估半导体、生物制药、医疗、实验室及科研院所、新能源等领域的洁净室、无尘室或者无菌室等环境。 一般来说&#xff0c;晶圆光刻、制造、测试等级为100级或1000级的洁净间&#xff0c;百级洁净间要求空气中0.5微米的尘埃粒子数不得超过每立方米3520个&#xff1b…

移动UI:新手指引页面,跟着指引不迷路。

移动端新手指引在提供用户引导、提升用户体验、提高用户留存率、促进功能使用和降低用户流失率方面都有积极的作用。 移动端新手指引在应用程序或移动网站中有以下几个作用&#xff1a; 1. 提供用户引导&#xff1a; 新手指引可以帮助用户快速了解应用程序或移动网站的功能和…

【网络安全】Exif 数据储存型XSS

未经许可,不得转载。 文章目录 Exif步骤Exif EXIF(Exchangeable Image File Format)数据是一种存储在图像文件中的元数据格式,常用于数码照片和扫描图像。它包含了与图像相关的各种信息,比如拍摄日期和时间、相机品牌和型号、拍摄时的设置(如曝光时间、光圈、ISO等)、地…

输送线相机拍照信号触发(博途PLC高速计数器中断立即输出应用)

博途PLC相关中断应用请参考下面文章链接: T法测速功能块 T法测速功能块(博途PLC上升沿中断应用)-CSDN博客文章浏览阅读165次。本文介绍了博途PLC中T法测速的原理和应用,包括如何开启上升沿中断、配置中断以及T法测速功能块的使用。重点讲述了在中断事件发生后执行的功能块处…

dp算法练习【6】

最长公共子序列 1143. 最长公共子序列 给定两个字符串 text1 和 text2&#xff0c;返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 &#xff0c;返回 0 。 一个字符串的 子序列 是指这样一个新的字符串&#xff1a;它是由原字符串在不改变字符的相对顺序…

被审稿人批得体无完肤?参考文献这样引用就对了!

我是娜姐 迪娜学姐 &#xff0c;一个SCI医学期刊编辑&#xff0c;探索用AI工具提效论文写作和发表。 审稿人对参考文献引用提出质疑&#xff0c;在comments中还挺常见的。一般来说&#xff0c;是最新的、相关的、重要的文献引用缺失。此外&#xff0c;如果仔细分析引文来源&…

QT定时器QObiect/QTimer

QT定时器 一、QObiect: startTimer ----------- killTimer 电子相册&#xff0c;利用定时器轮播图片 #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget) {ui->setupUi(this);picID …

【自动驾驶】控制算法(八)横向控制Ⅱ | Carsim 与 Matlab 联合仿真基本操作

写在前面&#xff1a; &#x1f31f; 欢迎光临 清流君 的博客小天地&#xff0c;这里是我分享技术与心得的温馨角落。&#x1f4dd; 个人主页&#xff1a;清流君_CSDN博客&#xff0c;期待与您一同探索 移动机器人 领域的无限可能。 &#x1f50d; 本文系 清流君 原创之作&…

[SWPUCTF 2021 新生赛]web方向(一到六题) 解题思路,实操解析,解题软件使用,解题方法教程

题目来源 NSSCTF | 在线CTF平台因为热爱&#xff0c;所以长远&#xff01;NSSCTF平台秉承着开放、自由、共享的精神&#xff0c;欢迎每一个CTFer使用。https://www.nssctf.cn/problem [SWPUCTF 2021 新生赛]gift_F12 这个题目简单打开后是一个网页 我们一般按F12或者是右键查…

AWTK 如何用 OpenGL 绘制图形

在有 GPU 的情况下&#xff0c;AWTK 使用 OpenGL 绘制图形。但是你会发现&#xff0c;如果自己在 paint 事件中使用 OpenGL 绘制图形&#xff0c;图形是无法显示的。原因是&#xff0c;AWTK 采用 nanovg 绘制图形&#xff0c;而 nanovg 并不是在绘制时立即执行的&#xff0c;而…

Visual Studio Code:让你的工作效率飞升的秘密武器

在现代软件开发环境中&#xff0c;效率已成为每个开发者追求的目标。而在众多编程工具中&#xff0c;Visual Studio Code&#xff08;简称VS Code&#xff09;凭借其强大的功能、轻量的界面和高度的可定制性&#xff0c;成为了全球开发者的首选。无论你是编写前端代码、后端服务…

分享MSSQL、MySql、Oracle的大数据批量导入方法及编程手法细节

1&#xff1a;MSSQL SQL语法篇&#xff1a; BULK INSERT [ database_name . [ schema_name ] . | schema_name . ] [ table_name | view_name ] FROM data_file [ WITH ( [ [ , ] BATCHSIZE batch_size ] [ [ , ] CHECK_CONSTRAINTS …

WIN11 ESP32 IDF + VSCODE 环境搭建[教程向]

前言 目录 前言 安装ESP32-IDF VSCODE插件安装 编译测试 很多时候我们想学习一门新的技能&#xff0c;需要使用全新的开发环境&#xff0c;很多时候我们会在安装环境这个环节卡住很久&#xff0c;这里简单介绍一下ESP32VSCODE环境搭建。 安装ESP32-IDF https://dl.espre…

概率DP (由一道绿题引起的若干问题。目前为一些老题,蒟蒻的尝试学习1.0)

概率DP&#xff1a; 利用动态规划去解决 概率 期望 的题目。 概率DP 求概率&#xff08;采用顺推&#xff09; 从 初始状态推向结果&#xff0c;同一般的DP类似&#xff0c;只是经历了概率论知识的包装。 老题&#xff1a; 添加链接描述 题意&#xff1a; 袋子里有w只白鼠&am…

热度DA!《黑神话:悟空》专题合集|4K电影及天命人资料免费领取!

热度DA&#xff01;《黑神话&#xff1a;悟空》专题合集&#xff5c;4K电影及天命人资料免费领取&#xff01; 前言《黑神话&#xff1a;悟空》专题合集 前言 《黑神话&#xff1a;悟空》正式全球解锁上线&#xff0c;这一中国首款 “3A” 游戏的发布&#xff0c;瞬间点燃了无…

MonoHuman: Animatable Human Neural Field from Monocular Video 翻译

MonoHuman&#xff1a;来自单目视频的可动画人类神经场 摘要。利用自由视图控制来动画化虚拟化身对于诸如虚拟现实和数字娱乐之类的各种应用来说是至关重要的。已有的研究试图利用神经辐射场&#xff08;NeRF&#xff09;的表征能力从单目视频中重建人体。最近的工作提出将变形…

【Netty】netty中都是用了哪些设计模式

对于工程师来说&#xff0c;掌握并理解运用设计模式&#xff0c;是非常重要的&#xff0c;但是除了学习基本的概念之外&#xff0c;需要结合优秀的中间件、框架源码学习其中的优秀软件设计&#xff0c;这样才能以不变应万变。 单例模式 单例模式解决的对象的唯一性&#xff0…

Unity 资源 之 Super Confetti FX:点亮项目的璀璨粒子之光

Unity 资源 之 Super Confetti FX&#xff1a;点亮项目的璀璨粒子之光 一&#xff0c;前言二&#xff0c;资源包内容三&#xff0c;免费获取资源包 一&#xff0c;前言 在创意的世界里&#xff0c;每一个细节都能决定一个项目的独特魅力。今天&#xff0c;要向大家介绍一款令人…

B端产品经理的流程设计思维

回首入行产品经理也已多年&#xff0c;做的项目也由C到B&#xff0c;由前到后都已涉及&#xff0c;辗转跨行仍觉互联网学海无涯&#xff0c;还是需要保持输出。思前想后还是决定聊一聊在过往服务多家大型集团的工作经历中十分重要&#xff0c;但却普遍不被视为产品经理必备能力…

Spring-循环依赖

预备知识 循环依赖开关(方法) - AbstractAutowireCapableBeanFactory#setAllowCircularReferences 单例工程(属性) - DefaultSingletonBeanRegistry#singletonFactories获取早期未处理Bean (方法) - AbstractAutowireCapableBeanFactory#getEarlyBeanReference早期未处理Bean…