TextView 显示内容时出现 ArrayIndexOutOfBoundsException 的解决方法(Android 4.1)
很久以前做的表情输入及显示,用的系统的SpannableString,完成后的代码在其他版本的Android手机上没有问题,但是在在4.1和4.1.1的手机上显示时,有概率出现程序崩溃的问题。
下面是此问题摘出的异常信息:
9-17 16:38:27.429: E/AndroidRuntime(10425): FATAL EXCEPTION: main
09-17 16:38:27.429: E/AndroidRuntime(10425): java.lang.ArrayIndexOutOfBoundsException: length=116; index=125
09-17 16:38:27.429: E/AndroidRuntime(10425): at android.text.MeasuredText.addStyleRun(MeasuredText.java:168)
09-17 16:38:27.429: E/AndroidRuntime(10425): at android.text.MeasuredText.addStyleRun(MeasuredText.java:204)
09-17 16:38:27.429: E/AndroidRuntime(10425): at android.text.StaticLayout.generate(StaticLayout.java:297)
09-17 16:38:27.429: E/AndroidRuntime(10425): at android.text.StaticLayout.<init>(StaticLayout.java:156)
09-17 16:38:27.429: E/AndroidRuntime(10425): at android.text.StaticLayout.<init>(StaticLayout.java:96)
09-17 16:38:27.429: E/AndroidRuntime(10425): at android.text.StaticLayout.<init>(StaticLayout.java:75)
09-17 16:38:27.429: E/AndroidRuntime(10425): at android.widget.TextView.makeSingleLayout(TextView.java:5942)
09-17 16:38:27.429: E/AndroidRuntime(10425): at android.widget.TextView.makeNewLayout(TextView.java:5782)
09-17 16:38:27.429: E/AndroidRuntime(10425): at android.widget.TextView.onMeasure(TextView.java:6139)
09-17 16:38:27.429: E/AndroidRuntime(10425): at android.view.View.measure(View.java:15264)
09-17 16:38:27.429: E/AndroidRuntime(10425): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4918)
09-17 16:38:27.429: E/AndroidRuntime(10425): at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1390)
09-17 16:38:27.429: E/AndroidRuntime(10425): at android.widget.LinearLayout.measureVertical(LinearLayout.java:681)
09-17 16:38:27.429: E/AndroidRuntime(10425): at android.widget.LinearLayout.onMeasure(LinearLayout.java:574)
09-17 16:38:27.429: E/AndroidRuntime(10425): at android.view.View.measure(View.java:15264)
09-17 16:38:27.429: E/AndroidRuntime(10425): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4918)
09-17 16:38:27.429: E/AndroidRuntime(10425): at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
09-17 16:38:27.429: E/AndroidRuntime(10425): at android.view.View.measure(View.java:15264)
09-17 16:38:27.429: E/AndroidRuntime(10425): at android.widget.ListView.setupChild(ListView.java:1893)
09-17 16:38:27.429: E/AndroidRuntime(10425): at android.widget.ListView.makeAndAddView(ListView.java:1803)
09-17 16:38:27.429: E/AndroidRuntime(10425): at android.widget.ListView.fillDown(ListView.java:681)
09-17 16:38:27.429: E/AndroidRuntime(10425): at android.widget.ListView.fillFromTop(ListView.java:742)
09-17 16:38:27.429: E/AndroidRuntime(10425): at android.widget.ListView.layoutChildren(ListView.java:1629)
09-17 16:38:27.429: E/AndroidRuntime(10425): at android.widget.AbsListView.onLayout(AbsListView.java:2224)
09-17 16:38:27.429: E/AndroidRuntime(10425): at android.view.View.layout(View.java:13846)
09-17 16:38:27.429: E/AndroidRuntime(10425): at android.view.ViewGroup.layout(ViewGroup.java:4466)
09-17 16:38:27.429: E/AndroidRuntime(10425): at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1649)
09-17 16:38:27.429: E/AndroidRuntime(10425): at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1507)
09-17 16:38:27.429: E/AndroidRuntime(10425): at android.widget.LinearLayout.onLayout(LinearLayout.java:1420)
09-17 16:38:27.429: E/AndroidRuntime(10425): at android.view.View.layout(View.java:13846)
09-17 16:38:27.429: E/AndroidRuntime(10425): at android.view.ViewGroup.layout(ViewGroup.java:4466)
09-17 16:38:27.429: E/AndroidRuntime(10425): at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1649)
09-17 16:38:27.429: E/AndroidRuntime(10425): at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1507)
09-17 16:38:27.429: E/AndroidRuntime(10425): at android.widget.LinearLayout.onLayout(LinearLayout.java:1420)
09-17 16:38:27.429: E/AndroidRuntime(10425): at android.view.View.layout(View.java:13846)
09-17 16:38:27.429: E/AndroidRuntime(10425): at android.view.ViewGroup.layout(ViewGroup.java:4466)
09-17 16:38:27.429: E/AndroidRuntime(10425): at android.widget.FrameLayout.onLayout(FrameLayout.java:448)
09-17 16:38:27.429: E/AndroidRuntime(10425): at android.view.View.layout(View.java:13846)
09-17 16:38:27.429: E/AndroidRuntime(10425): at android.view.ViewGroup.layout(ViewGroup.java:4466)
09-17 16:38:27.429: E/AndroidRuntime(10425): at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1649)
09-17 16:38:27.429: E/AndroidRuntime(10425): at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1507)
09-17 16:38:27.429: E/AndroidRuntime(10425): at android.widget.LinearLayout.onLayout(LinearLayout.java:1420)
09-17 16:38:27.429: E/AndroidRuntime(10425): at android.view.View.layout(View.java:13846)
09-17 16:38:27.429: E/AndroidRuntime(10425): at android.view.ViewGroup.layout(ViewGroup.java:4466)
09-17 16:38:27.429: E/AndroidRuntime(10425): at com.component.SinglePreviewContainer.onLayout(SinglePreviewContainer.java:124)
09-17 16:38:27.429: E/AndroidRuntime(10425): at android.view.View.layout(View.java:13846)
09-17 16:38:27.429: E/AndroidRuntime(10425): at android.view.ViewGroup.layout(ViewGroup.java:4466)
09-17 16:38:27.429: E/AndroidRuntime(10425): at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1649)
09-17 16:38:27.429: E/AndroidRuntime(10425): at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1507)
09-17 16:38:27.429: E/AndroidRuntime(10425): at android.widget.LinearLayout.onLayout(LinearLayout.java:1420)
09-17 16:38:27.429: E/AndroidRuntime(10425): at android.view.View.layout(View.java:13846)
09-17 16:38:27.429: E/AndroidRuntime(10425): at android.view.ViewGroup.layout(ViewGroup.java:4466)
09-17 16:38:27.429: E/AndroidRuntime(10425): at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1649)
09-17 16:38:27.429: E/AndroidRuntime(10425): at android.widget.LinearLayout.layoutHorizontal(LinearLayout.java:1638)
09-17 16:38:27.429: E/AndroidRuntime(10425): at android.widget.LinearLayout.onLayout(LinearLayout.java:1422)
09-17 16:38:27.429: E/AndroidRuntime(10425): at android.view.View.layout(View.java:13846)
09-17 16:38:27.429: E/AndroidRuntime(10425): at android.view.ViewGroup.layout(ViewGroup.java:4466)
09-17 16:38:27.429: E/AndroidRuntime(10425): at android.widget.RelativeLayout.onLayout(RelativeLayout.java:948)
09-17 16:38:27.429: E/AndroidRuntime(10425): at android.view.View.layout(View.java:13846)
09-17 16:38:27.429: E/AndroidRuntime(10425): at android.view.ViewGroup.layout(ViewGroup.java:4466)
09-17 16:38:27.429: E/AndroidRuntime(10425): at android.widget.FrameLayout.onLayout(FrameLayout.java:448)
09-17 16:38:27.429: E/AndroidRuntime(10425): at android.view.View.layout(View.java:13846)
09-17 16:38:27.429: E/AndroidRuntime(10425): at android.view.ViewGroup.layout(ViewGroup.java:4466)
09-17 16:38:27.429: E/AndroidRuntime(10425): at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1649)
09-17 16:38:27.429: E/AndroidRuntime(10425): at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1507)
原因:当TextView显示的表情恰好要被换行符截断的时候,会报异常(目前只在4.1和4.1.1上出现)
解决方式:
重写TextView 在onMeasure()中捕获异常
public class PatchedTextView extends TextView {
public PatchedTextView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public PatchedTextView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public PatchedTextView(Context context) {
super(context);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
try{
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}catch (ArrayIndexOutOfBoundsException e){
setText(getText().toString());
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
}
@Override
public void setGravity(int gravity){
try{
super.setGravity(gravity);
}catch (ArrayIndexOutOfBoundsException e){
setText(getText().toString());
super.setGravity(gravity);
}
}
@Override
public void setText(CharSequence text, BufferType type) {
try{
super.setText(text, type);
}catch (ArrayIndexOutOfBoundsException e){
setText(text.toString());
}
}
}
崩溃的特征:
当Android正在渲染一个非常长的一行内容到屏幕的时候,它需要去指出在哪里划线。但是如果下面的一些情况都满足了,就会出现一次崩溃:
1. 文本内容包括了MetricAffectingSpans (另:StyleSpan是它的一个子类).其他类型的Spans不会产生这个崩溃。
2.在一个此词的中间存在MetricAffectingSpans的内容开始或者结尾的词(例如:一个词的前一半是加粗,但是后一半不是加粗的)
3. 需要在一个word的非跨越的部分自动换行
4.代码运行在Android 4.1的手机上面。
TextView 显示内容时出现 ArrayIndexOutOfBoundsException 的解决方法(Android 4.1)的更多相关文章
- combogrid翻页后保持显示内容为配置的textField解决办法
easyui的combogrid当配置pagination为true进行分页时,当datagrid加载其他数据页,和上一次选中的valueField不匹配时,会导致combogrid直接显示value ...
- 关于php读mysql数据库时出现乱码的解决方法
关于php读mysql数据库时出现乱码的解决方法 php读mysql时,有以下几个地方涉及到了字符集. 1.建立数据库表时指定数据库表的字符集.例如 create table tablename ( ...
- PL/SQL Developer 使用中文条件查询时无数据的解决方法(转)
原文地址: PL/SQL Developer 使用中文条件查询时无数据的解决方法 PL/SQL Developer 使用中文条件查询时无数据,这是由于字符集的不一致导致的. 执行以下sql命令:sel ...
- 弹出USB大容量存储设备时出问题的解决方法
我的计算机->管理->系统工具->事件查看器->自定义视图->Kernel-Pnp->详情->进程ID 然后在任务管理器里找到该进程(任务管理器->查看 ...
- 用c#读取文件内容中文是乱码的解决方法:
用c#读取文件内容中文是乱码的解决方法: //方法1: StreamReader din = new StreamReader(@"C:\1.txt", System.Text.E ...
- linux上备份Oracle时EXP-00091的错误解决方法
unix/linux上备份Oracle时EXP-00091的错误解决方法 unix/linux上备份数据时的错误解决方法 EXP-00091: Exporting questionable stati ...
- webstorm无法显示左边文件夹目录的解决方法
webstorm无法显示左边文件夹目录的解决方法 方法一 view-->Tool Windows-->Project 就可以显示或者关闭 方法二 1.删除webstorm的配置文件夹 2. ...
- Android开发环境搭建时遇到问题的解决方法
版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/linux_loajie/article/details/33823637 Android开发环境搭建 ...
- dedecms织梦手机端文章内容页图片不能自适应解决方法
dedecms织梦手机端文章内容页图片不能自适应解决方法: 方法一修改手机端文章页模板代码: 找到并打开手机端的文章内容页模板,将里面的{dede:field.body/}标签修改一下,改为如下的标签 ...
随机推荐
- Win7 64位 VS2015环境使用qt-msvc2015-5.6.0
QT下载 http://www.qt.io/download-open-source/#section-2 我用的是 qt-opensource-windows-x86-msvc2015-5.6.0. ...
- angular中的 ng-change
<!DOCTYPE HTML> <html ng-app="myApp"> <head> <meta http-equiv="C ...
- Python成长笔记 - 基础篇 (十一)----RabbitMQ、Redis 、线程queue
本节内容: 1.RabbitMQ 消息队列 2.Redis 3.Mysql PY 中的线程queue(threading Queue):用于多个线程之间进行数据交换,不能在进程间进行通信 进程qu ...
- Drupal 7 安装时的数据库问题
在安装D7时,需要用PhpMyAdmin创建数据库,不建议使用ROOT帐号而需要建立一个新的帐号.一般,建立一个新的账号,如foo,并同时建一个同名的数据库,选择localhost(如果是本地).但是 ...
- map() 函数
map()函数 map()是 Python 内置的高阶函数,它接收一个函数 f 和一个 list,并通过把函数 f 依次作用在 list 的每个元素上,得到一个新的 list 并返回. 例如,对于li ...
- iOS 时间戳的转换
在开发iOS程序时,有时候需要将时间格式调整成自己希望的格式,这个时候我们可以用NSDateFormatter类来处理.例如: //实例化一个NSDateFormatter对象 NSDateForma ...
- ASP.NET连接远程Oracle数据库,提示试图加载格式不正确的程序
VS调试远程连接Oracle数据库,一直报错 由于本地计算机是64位的操作系统,而且也确定安装的Oracle客户端是64位的 ,但是一直提示这个错误. 试了很多方法,终于发现可能是 不能在VS中调试的 ...
- 记AbpSession扩展实现过程
AbpSession只给了userId和TenantId,这次实际项目中并不够用,网上找了很久也没找到好的实现方法.项目初期没有时间进行研究,最近空了试了一下,大致实现添加额外字段并读取相应值的功能. ...
- savepoint原理
保存点 在MySQL中, 保存点SAVEPOINT属于事务控制处理部分.利用SAVEPOINT可以回滚指定部分事务,从而使事务处理更加灵活和精细.SAVEPOINT相关的SQL语句如下 SAVEPOI ...
- 不用asp.net MVC,用WebForm照样可以实现MVC(请看最后一句话)
在<避开WebForm天坑,拥抱ASP.Net MVC吧>这篇博客中我讲到了ASP.net WebForm由于一些先天的“诱导犯罪”的缺陷,现在用ASP.net MVC的公司越来越多.但是 ...