接着早前的安卓开发中遇到的奇奇怪怪的问题(一) ,再向大家分享我在项目中遇到的奇怪问题。希望对大家有帮助。
1.RecyclerView自动滚动
之前碰到的一个奇怪问题:RecyclerView 嵌套 RecyclerView,结果内部的RecyclerView会自动的滑动至顶部。最终找到了解决方法:RecyclerView常见问题解决方案
两种解决办法:
一. 内部Recyclerview去除焦点,父布局里获得焦点。
recyclerview.setFocusableInTouchMode(false);
recyclerview.requestFocus();
比如父布局的一个textview。
textview.setFocusableInTouchMode(true);
textview.requestFocus();
二. 内部的Recyclerview加
android:overScrollMode="never"
父布局覆盖子VIew获取焦点:
android:descendantFocusability="blocksDescendants"
当然不推荐使用RecyclerView 嵌套 RecyclerView这种写法了。。。
2.NumberFormatException
起因是Bugly上报了一个错误:
说是我格式化“0,00”这样的一个字符串。代码大致如下:
String.format("%.2f", number);
排除了格式字符串的问题后我就纳闷了。中间经过了大量的搜索。。。,发现是格式化的问题。也就是在不指定Locale
时,是跟随系统语言。在法语、德语、意大利语的语言中,格式化小数是逗号的。所以解决方法:
String.format(Locale.CHINA, "%.2f", number);
3.SecurityException
在之前项目中做了6.0的动态权限后,Bugly报错如下:
更奇怪的是报错的全部都是6.0的手机。
查了一下,找到了问题。发现是6.0的一个bug,在部分6.0上CHANGE_NETWORK_STATE
权限获取不到,那么只能去获取WRITE_SETTINGS
这个权限了。这个问题已经在6.0.1修复了。附上链接地址,
既然是6.0的问题,我们可以对6.0进行单独处理。抛出异常处或者在使用CHANGE_NETWORK_STATE
权限前跳转到系统设置页去设置。
if(Build.VERSION.SDK_INT == Build.VERSION_CODES.M) {
if (!Settings.System.canWrite(context)) {
Intent intent = new Intent(android.provider.Settings.ACTION_MANAGE_WRITE_SETTINGS);
intent.setData(Uri.parse("package:" + context.getPackageName()));
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);
}
}
当然也可以参考这位兄弟的方法:Android 6 完美解决 WRITE_SETTINGS 权限设置问题
4.WebView中Http和Https加载问题
比如https页面加载http图片或者http页面加载https图片时图片显示不出来,原因是因为在Android 5.0开始WebView默认不允许加载http与https混合页面,
解决办法:
//https与http混合资源处理
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
webSettings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
}
当然最好还是不要混合,保持统一。
5.一些注意点
使用
Glide
时,注意对传入的Acticity
与Fragment
进行判断,避免传入已经销毁Acticity
,造成IllegalArgumentException
异常。可以参考这篇Glide类似You cannot start a load for a destroyed activity异常简单分析在做6.0动态权限时,如果有申请相机权限时,应该保证
Manifest.permission.CAMERA
和Manifest.permission.WRITE_EXTERNAL_STORAGE
权限同时申请,不要漏掉后者。
6.参考
暂时就这么多了,都是干货。码字不易,多多点赞。