2019年12月工作整理
1202
关于compileDebugJavaWithJavac的错误信息
可以使用下面的命令查看具体的错误信息
gradlew compileDebugSources --stacktrace -info
关于TextView设置ClickableSpan
点击结尾空白位置也响应点击的问题
项目中需要在一段文字的最后两个字加点击事件,正常设置之后发现点击结尾空白的位置也会响应点击事件。明明已经设置了点击区间。
解决方法:在后边紧接着追加一个0宽度字
builder.append("\u200b");
或者直接在文字后面添加。参考文档
点击有点击事件的文字出现下面的背景色
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-T5Ho7jek-1578121774004)
很丑,如何修改呢?
这里就需要用到TextView的setHighlightColor属性,Android4.0以上默认是淡绿色,低版本的是黄色。
我们需要通过这个方法重新设置背景色。
1203
ClickableSpan 引起的内存泄漏
项目中接入leakcanary后,今天早上发现一条内存泄漏由ClickableSpan引起的,百度之后果然有人和遇到同样的问题,这里记录一下。
解决方法:参考文献
1204
android富文本 加载带图片的html
- https://blog.csdn.net/soullines/article/details/75669585
1205
骨架屏
即表示在页面完全渲染完成之前,用户会看到一个占位的样式,用以描绘了当前页面的大致框架,加载完成后,最终骨架屏中各个占位部分将被真实的数据替换。
骨架屏(Skeleton Screen)在Android中的应用
1209
Dialog弹出状态栏变黑的问题
项目中底部回复框,用的是DialogFragment,设置了Window的高度为WindowManager.LayoutParams.MATCH_PARENT的时候,当dialog弹出的时候,状态栏为变色黑色的(设置成固定高度的时候,并不会变黑)
解决办法:手动设置状态栏为透明状态
// 设置宽度为屏宽, 靠近屏幕底部。
Window window = getDialog().getWindow();
WindowManager.LayoutParams lp = window.getAttributes();
// 设置状态栏为透明色
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
}
lp.gravity = Gravity.BOTTOM;
lp.width = WindowManager.LayoutParams.MATCH_PARENT;
// WindowManager.LayoutParams.MATCH_PARENT换成固定高度不会出现黑色状态栏
lp.height = WindowManager.LayoutParams.MATCH_PARENT;
window.setAttributes(lp);
1210
常用转义符
空格  ;  ;
< 小于号 <; <;
> 大于号 >; >;
& 与号 &; &;
” 引号 "; ";
‘ 撇号 &apos; ';
× 乘号 ×; ×;
÷ 除号 ÷; ÷;
1211
databinding 中字符串拼接的问题
databinding里面的拼接不能像下面这样
android:text='@{"username:"+bean.name}'
这样编译的时候会报错
正确的写法是下面这样
android:text='@{@string/user_name+bean.name}'
需采用 @string/xxxx的形式进行字符串的拼接
1213
AndResGuard压缩会影响性能吗
resources.arsc压缩会影响性能吗
AndResGuard is promoting some bad practices
1218
RecyclerView 设置分割线
RecyclerView 增加了设置分割新的类
androidx.recyclerview.widget.DividerItemDecoration
1220
com.google.gson Gson 解析时报错: declares multiple JSON fields named XXX
报错内容如下:
java.lang.IllegalArgumentException: class com.caiyu.m_home.entity.allreply.ReplyListEntity declares multiple JSON fields named viewModel
原因是:子类和父类有相同的字段属性。
解决办法:
- (1)将父类中的该字段去掉(不要),或者在需要打印的字段上加上注解@Expose
- (2):由于我报错的类都是在jar包里面,所以第一种方法不好使。只好采用其他日志输出的方法-- com.alibaba.fastjson.JSON.toJson();
1225
使用GSON 转换的时候报下面的错误
- Unable to create converter for xxx
- Attempt to invoke virtual method ‘java.lang.reflect.Method java.lang.Class.getMethod(java.lang.String, java.lang.Class[])’
- Can not make a java.lang.reflect.Method constructor accessible
错误产生的原因,是在用Gson转换javaBean的时候,在类文件中存在有类型为java.lang.reflect.Method的字段的类型,所以报以上错误。检查确实是的,在该字段前面加上transient标记就可以了。
不过这个问题貌似在Android 9.0以上不会报,是在8.0上测试出来的。
1230
Caused by: java.lang.IllegalStateException: Expected Android API level 21+ but was 19
今早将项目在Android 4.4 手机上跑了一下,直接崩溃了,看到如上log信息,应该是版本问题,看了okhttp的官方介绍最新版的okhttp已经放弃4.4手机了
由于前几天将Retrofit的版本升到2.7,内置的okhttp最低支持5.0,现在要么放弃4.4的用户,用么将Retrofit的版本降到2.5可以解决问题。
1231
retrofit上传附件时候文件名是中文问题
Unexpected char 0x65b0 at 34 in Content-Disposition value: form-data; name=“file”;
测试人员在上传图片的时候,选择了一张中文命名的图片文件,导致程序崩溃。
okhttp3.Headers里面做了校验
static void checkName(String name) {
if (name == null) throw new NullPointerException("name == null");
if (name.isEmpty()) throw new IllegalArgumentException("name is empty");
for (int i = 0, length = name.length(); i < length; i++) {
char c = name.charAt(i);
if (c <= '\u0020' || c >= '\u007f') {
throw new IllegalArgumentException(Util.format(
"Unexpected char %#04x at %d in header name: %s", (int) c, i, name));
}
}
}
网上解决方案:
- URLEncoder.encode(file.getName(),“UTF-8”);//App传递给后台时候编码
- URLDecoder.decode(ss,“UTF-8”);//后台接到时候进行转码
我的解决方案是检查是否含有中文,然后重命名文件