接着早前的安卓開發中遇到的奇奇怪怪的問題(一) ,再向大家分享我在項目中遇到的奇怪問題。希望對大家有幫助。
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.參考
暫時就這麼多了,都是乾貨。碼字不易,多多點贊。