Przeglądaj źródła

Fix WindowManager$BadTokenException throwed from MyKMPDFContextMenuCallback

cooperku_kdanmobile 5 lat temu
rodzic
commit
e3128ce52b

+ 31 - 1
src/main/java/com/kdanmobile/reader/screen/contextmenu/MyKMPDFContextMenuCallback.kt

@@ -71,7 +71,37 @@ open class MyKMPDFContextMenuCallback(private val kmpdfFactory: KMPDFFactory?) :
             }
             popupWindow?.isOutsideTouchable = false
             popupWindow?.isFocusable = false
-            popupWindow?.showAtLocation(view, Gravity.LEFT or Gravity.TOP, position.x, position.y)
+            showPopupWindow(view, position)
+        }
+    }
+
+    private fun showPopupWindow(view: View, position: Point) {
+        if (null != view.windowToken) {
+            try {
+                view.post {
+                    popupWindow?.showAtLocation(view, Gravity.LEFT or Gravity.TOP, position.x, position.y)
+                }
+            } catch (e: Exception) {
+                e.printStackTrace()
+            }
+        } else {
+            view.addOnAttachStateChangeListener(object: View.OnAttachStateChangeListener {
+                override fun onViewAttachedToWindow(view: View) {
+                    if (null != view.windowToken) {
+                        try {
+                            view.post {
+                                popupWindow?.showAtLocation(view, Gravity.LEFT or Gravity.TOP, position.x, position.y)
+                            }
+                            view.removeOnAttachStateChangeListener(this)
+                        } catch (e: Exception) {
+                            e.printStackTrace()
+                        }
+                    }
+                }
+
+                override fun onViewDetachedFromWindow(view: View) {
+                }
+            })
         }
     }