天天看點

Android開發中遇到的問題

1、自定義View ,wrap_content 不處理時和父布局大小一樣(占滿父布局)。可以檢視View的getDefaultSize方法。

2、NestedScrollView 嵌套 豎向的RecyclerView 時,item會被全部建立出來。具體可看 measureChildWithMargins方法,傳給RecyclerView的是UNSPECIFIED。

3、RxJava : repeatWhen() 和 retryWhen() 差別就在于什麼樣的終止事件會觸發重訂閱:當.repeat()接收到.onCompleted()事件後觸發重訂閱 ; 當.retry()接收到.onError()事件後觸發重訂閱;

被傳回的Observable<?>所要發送的事件決定了重訂閱是否會發生。
 如果發送的是onCompleted或者onError事件,将不會觸發重訂閱。
 相對的,如果它發送onNext事件,則觸發重訂閱(不管onNext實際上是什麼事件)。
 這就是為什麼使用了通配符作為泛型類型:這僅僅是個通知(next, error或者completed),一個很重要的通知而已。
           

4、PopUpWindow 中有EditText 時,且 EditText 沒有設定inputType , 使用原生輸入法輸入錯誤單詞,按空格鍵,提示單詞錯誤時,移動光标到錯誤的單詞中,會導緻閃退:

android.view.WindowManager$BadTokenException: Unable to add window -- token [email protected] is not valid; is your activity running?
    at android.view.ViewRootImpl.setView(ViewRootImpl.java:769)
    at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:356)
    at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:93)
    at android.widget.PopupWindow.invokePopup(PopupWindow.java:1429)
    at android.widget.PopupWindow.showAtLocation(PopupWindow.java:1203)
    at android.widget.PopupWindow.showAtLocation(PopupWindow.java:1170)
    at android.widget.Editor$PinnedPopupWindow.updatePosition(Editor.java:3186)
    at android.widget.Editor$PinnedPopupWindow.show(Editor.java:3142)
    at android.widget.Editor$SuggestionsPopupWindow.show(Editor.java:3587)
    at android.widget.Editor.replace(Editor.java:381)
    at android.widget.Editor$3.run(Editor.java:2223)
           

解決辦法時給EditText設定inputType為 textNoSuggestions 。該問題在Android 8上出現。Android 10/11沒有出現。

5、如果NestedScrollView裡面沒有RecyclerView, setOnTouchListener會被調用,setOnScrollChangeListener(NestedScrollView的OnScrollChangeListener)不會被調用; 如果NestedScrollView裡面有RecyclerView, setOnScrollChangeListener(NestedScrollView的OnScrollChangeListener)會被調用,setOnTouchListener卻不會被調用; 不管NestedScrollView裡面有沒有RecyclerView,setOnScrollChangeListener(View.OnScrollChangeListener)都會被調用。

6、Android8.0上:

1)、設定了android:windowIsTranslucent 為 true 後,不能設定android:screenOrientation 會報錯java.lang.IllegalStateException: Only fullscreen opaque activities can request orientation。
2)、Activity使用共享元素啟動:
val options = ActivityOptionsCompat.makeSceneTransitionAnimation(activity, view, "sharedName")
ActivityCompat.startActivity(activity, intent, options.toBundle())
啟動後如果 setRequestedOrientation 改變Activity的方向,會報錯:java.lang.IllegalStateException: Only fullscreen activities can request orientation
解決方法是給這個Activity設定android:windowIsTranslucent 為 true。這樣setRequestedOrientation就不會報錯了。
           

7、ViewPager中使用PhotoView,多隻手指左右滑動和縮放圖檔一起操作時,可出現下面異常:

Fatal Exception: java.lang.IllegalArgumentException:pointerIndex out of range
           

解決辦法是使用 ViewPager2 代替 ViewPager 即可。

8、BottomNavigationView或Viewpager 有些情況選中不了對應item,比如頁面剛打開時或者頁面不在棧頂(背景),延時執行選中方法方可。

9、靜态内部類,在被調用時才會被加載(靜态内部類實作單例是懶加載)。

10、fastjson解析Kotlin Data類可能會出現問題:

data類要有預設構造方法,不然報錯;
如果data類包含list,這個list的元素會被解析為JsonObject,而不是指定的類型;
           

11、繼承Dialog自定義彈框,要設定彈框沒有黑邊,通過style樣式指定windowBackground為透明和windowIsTranslucent為true是沒有效果的,必須通過下面方法實作:

attributes.format = PixelFormat.TRANSPARENT
setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))