Ver código fonte

[feat]键盘插件,封装BasePopupDialog,使用PopupWindow来实现弹窗

hezihao 8 meses atrás
pai
commit
67f526098a

+ 5 - 0
plugins/keyboard_android/android/build.gradle

@@ -62,6 +62,11 @@ android {
         minSdk = 21
     }
 
+    buildFeatures {
+        // 生成BuildConfig
+        buildConfig true
+    }
+
     def glide_version = '4.13.2'
 
     dependencies {

+ 4 - 0
plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/component/child/impl/ToolBarComponent.kt

@@ -49,6 +49,10 @@ class ToolBarComponent @JvmOverloads constructor(
                 ComponentMediator.findComponent<IKeyboardRootComponent>(IKeyboardRootComponent::class.java)
             rootComponent?.switchSettingPage()
         }
+//        vIcon.longClick {
+//            PermissionDialogUtil.showPermissionDialog(context)
+//            true
+//        }
         vPinyinSwitchBtn.click {
             // 切换拼音键盘或AI键盘
             KeyboardHolder.getKeyboardService()?.getKeyboardViewModel()?.run {

+ 0 - 13
plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/ext/DialogExt.kt

@@ -1,13 +0,0 @@
-package com.atmob.keyboard_android.ext
-
-import android.app.Dialog
-import android.view.Window
-import android.view.WindowManager
-
-/**
- * 设置Service的WindowToken给Dialog
- */
-fun Dialog.setServiceWindowToken(hostWindow: Window) {
-    this.window?.setType(WindowManager.LayoutParams.TYPE_APPLICATION_ATTACHED_DIALOG)
-    this.window?.attributes?.token = hostWindow.attributes.token
-}

+ 7 - 13
plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/ui/dialog/ConfirmDialog.kt

@@ -1,16 +1,17 @@
-package com.atmob.keyboard_android.ui.dialog
+package com.atmob.keyboard_android.ui.popup
 
 import android.content.Context
 import android.view.View
+import android.view.Window
 import android.widget.TextView
 import com.atmob.keyboard_android.R
 import com.atmob.keyboard_android.ext.click
-import com.atmob.keyboard_android.ui.dialog.base.BaseDialog
+import com.atmob.keyboard_android.ui.popup.base.BasePopupDialog
 
 /**
  * 确认弹窗
  */
-class ConfirmDialog(context: Context) : BaseDialog(context) {
+class ConfirmDialog(private val context: Context, hostWindow: Window) : BasePopupDialog(context, hostWindow) {
     private lateinit var vCloseBtn: View
     private lateinit var vTitle: TextView
     private lateinit var vContent: TextView
@@ -44,17 +45,17 @@ class ConfirmDialog(context: Context) : BaseDialog(context) {
         super.onBindView(view)
         vCloseBtn.click {
             // 关闭
-            dismissDialog()
+            dismiss()
         }
         vRejectBtn.click {
             // 拒绝
             mOnActionCallback?.onReject()
-            dismissDialog()
+            dismiss()
         }
         vAllowBtn.click {
             // 允许
             mOnActionCallback?.onAllow()
-            dismissDialog()
+            dismiss()
         }
     }
 
@@ -87,13 +88,6 @@ class ConfirmDialog(context: Context) : BaseDialog(context) {
         }
     }
 
-    override fun onSetupDialogFrameSize(
-        screenWidth: Int,
-        screenHeight: Int
-    ): IntArray {
-        return intArrayOf(screenWidth, screenHeight)
-    }
-
     class DataModel(
         // 标题
         val title: String,

+ 97 - 0
plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/ui/popup/base/BasePopupDialog.kt

@@ -0,0 +1,97 @@
+package com.atmob.keyboard_android.ui.popup.base
+
+import android.content.Context
+import android.graphics.Color
+import android.graphics.drawable.ColorDrawable
+import android.view.Gravity
+import android.view.LayoutInflater
+import android.view.View
+import android.view.Window
+import android.view.WindowManager
+import android.widget.PopupWindow
+import com.atmob.keyboard_android.ui.core.LayoutCallback
+
+/**
+ * 使用PopupWindow来实现弹窗
+ */
+abstract class BasePopupDialog(context: Context, private val hostWindow: Window) :
+    LayoutCallback {
+    private var mPopupWindow: PopupWindow? = null
+
+    init {
+        onLayoutBefore()
+
+        // 填充布局
+        val contentView = LayoutInflater.from(context).inflate(onInflaterViewId(), null, false)
+
+        // 配置 PopupWindow
+        mPopupWindow = PopupWindow(
+            contentView,
+            WindowManager.LayoutParams.MATCH_PARENT,
+            WindowManager.LayoutParams.MATCH_PARENT
+        ).apply {
+            // 不获取焦点,否则获取焦点会将软键盘关闭
+            isFocusable = false
+            // 保持输入法活跃
+            inputMethodMode = PopupWindow.INPUT_METHOD_NEEDED
+            // 点击外部区域,是否关闭弹窗
+            isOutsideTouchable = isCanOutsideTouchable()
+            // 设置背景,否则还是会关闭
+            setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))
+        }
+
+        onInflaterViewAfter(contentView)
+        onBindView(contentView)
+        setData()
+    }
+
+    /**
+     * 显示Loading
+     */
+    fun show() {
+        if (mPopupWindow?.isShowing == true) {
+            return
+        }
+
+        // 显示在屏幕中央
+        mPopupWindow?.showAtLocation(
+            hostWindow.decorView,
+            Gravity.CENTER,
+            0,
+            0
+        )
+    }
+
+    override fun onLayoutBefore() {
+    }
+
+    override fun onInflaterViewAfter(view: View) {
+    }
+
+    override fun onBindView(view: View) {
+    }
+
+    override fun setData() {
+    }
+
+    /**
+     * 是否允许点击外部区域,关闭弹窗
+     */
+    protected open fun isCanOutsideTouchable(): Boolean {
+        return true
+    }
+
+    /**
+     * 是否正在显示
+     */
+    fun isShowing(): Boolean {
+        return mPopupWindow?.isShowing == true
+    }
+
+    /**
+     * 隐藏Loading
+     */
+    fun dismiss() {
+        mPopupWindow?.dismiss()
+    }
+}

+ 2 - 6
plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/util/PermissionDialogUtil.kt

@@ -2,8 +2,7 @@ package com.atmob.keyboard_android.util
 
 import android.content.Context
 import com.atmob.keyboard_android.R
-import com.atmob.keyboard_android.ext.setServiceWindowToken
-import com.atmob.keyboard_android.ui.dialog.ConfirmDialog
+import com.atmob.keyboard_android.ui.popup.ConfirmDialog
 
 /**
  * 权限弹窗工具类
@@ -21,10 +20,7 @@ class PermissionDialogUtil {
 
             val keyboardWindow = keyboardService.getKeyboardWindow()
 
-            ConfirmDialog(context)
-                .apply {
-                    setServiceWindowToken(keyboardWindow)
-                }
+            ConfirmDialog(context, keyboardWindow)
                 .bindDataModel(
                     ConfirmDialog.DataModel(
                         title = context.resources.getString(R.string.dialog_permission_tip_title),

+ 8 - 56
plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/util/loading/LoadingDialog.kt

@@ -1,69 +1,21 @@
 package com.atmob.keyboard_android.util.loading
 
 import android.content.Context
-import android.graphics.Color
-import android.graphics.drawable.ColorDrawable
-import android.view.Gravity
-import android.view.LayoutInflater
 import android.view.Window
-import android.view.WindowManager
-import android.widget.PopupWindow
 import com.atmob.keyboard_android.R
+import com.atmob.keyboard_android.ui.popup.base.BasePopupDialog
 
 /**
  * Loading弹窗
  */
-class LoadingDialog(private val context: Context, private val hostWindow: Window) {
-    private var mPopupWindow: PopupWindow? = null
-
-    /**
-     * 显示Loading
-     */
-    fun show() {
-        if (mPopupWindow?.isShowing == true) {
-            return
-        }
-
-        // 填充布局
-        val contentView = LayoutInflater.from(context).inflate(R.layout.dialog_loading, null, false)
-
-        // 配置 PopupWindow
-        mPopupWindow = PopupWindow(
-            contentView,
-            WindowManager.LayoutParams.MATCH_PARENT,
-            WindowManager.LayoutParams.MATCH_PARENT
-        ).apply {
-            // 不获取焦点,否则获取焦点会将软键盘关闭
-            isFocusable = false
-            // 保持输入法活跃
-            inputMethodMode = PopupWindow.INPUT_METHOD_NEEDED
-            // 禁止点击外部区域,关闭弹窗
-            isOutsideTouchable = false
-            // 设置背景,否则还是会关闭
-            setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))
-        }
-
-        // 显示在屏幕中央
-        mPopupWindow?.showAtLocation(
-            hostWindow.decorView,
-            Gravity.CENTER,
-            0,
-            0
-        )
-    }
-
-    /**
-     * 是否正在显示
-     */
-    fun isShowing(): Boolean {
-        return mPopupWindow?.isShowing == true
+class LoadingDialog(context: Context, hostWindow: Window) :
+    BasePopupDialog(context, hostWindow) {
+    override fun onInflaterViewId(): Int {
+        return R.layout.dialog_loading
     }
 
-    /**
-     * 隐藏Loading
-     */
-    fun dismiss() {
-        mPopupWindow?.dismiss()
-        mPopupWindow = null
+    override fun isCanOutsideTouchable(): Boolean {
+        // 禁止点击外部区域,关闭弹窗
+        return false
     }
 }

+ 1 - 1
plugins/keyboard_android/android/src/main/res/layout/dialog_confirm.xml

@@ -3,7 +3,7 @@
     xmlns:tools="http://schemas.android.com/tools"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
-    tools:background="@color/bg_dialog_dim">
+    android:background="@color/bg_dialog_dim">
 
     <FrameLayout
         android:layout_width="wrap_content"