1
0
Эх сурвалжийг харах

0.0.37.alpha7:
尝试性加入了Window实现模式,要尝试可以在App.java中修改DialogX.implIMPLMode= DialogX.IMPL_MODE.WINDOW;但现在遇到两个问题:1是在Activity的onActivityPreDestroyed事件(onDestroy发生前)已经对windowManager执行了removeView,但依然会引发WindowLeaked错误,目前尚无法查明原因;2是使用Window实现时PopTip无法做到空白区域触控穿透。希望大家能帮帮忙想想办法,可下拉最新的代码进行尝试,若实在不行Window实现模式将在下一个版本去掉。

kongzue 3 жил өмнө
parent
commit
59c8268c3a

+ 7 - 0
DialogX/src/main/java/com/kongzue/dialogx/DialogX.java

@@ -33,6 +33,9 @@ public class DialogX {
     //TipDialog 和 WaitDialog 明暗风格,不设置则默认根据 globalTheme 定义
     public static DialogX.THEME tipTheme;
     
+    //DialogX 实现模式
+    public static IMPL_MODE implIMPLMode = IMPL_MODE.VIEW;
+    
     //对话框最大宽度(像素)
     public static int dialogMaxWidth;
     
@@ -107,6 +110,10 @@ public class DialogX {
         LIGHT, DARK, AUTO
     }
     
+    public enum IMPL_MODE {
+        VIEW, WINDOW
+    }
+    
     public static void init(Context context) {
         if (context == null) {
             error(ERROR_INIT_TIPS);

+ 3 - 3
DialogX/src/main/java/com/kongzue/dialogx/dialogs/BottomDialog.java

@@ -181,7 +181,7 @@ public class BottomDialog extends BaseDialog {
         
         dialogView = createView(layoutId);
         dialogImpl = new DialogImpl(dialogView);
-        dialogView.setTag(dialogKey());
+        dialogView.setTag(me);
         show(dialogView);
     }
     
@@ -194,7 +194,7 @@ public class BottomDialog extends BaseDialog {
         
         dialogView = createView(layoutId);
         dialogImpl = new DialogImpl(dialogView);
-        dialogView.setTag(dialogKey());
+        dialogView.setTag(me);
         show(activity, dialogView);
     }
     
@@ -932,7 +932,7 @@ public class BottomDialog extends BaseDialog {
         enterAnimDuration = 0;
         dialogView = createView(layoutId);
         dialogImpl = new DialogImpl(dialogView);
-        dialogView.setTag(dialogKey());
+        dialogView.setTag(me);
         show(dialogView);
     }
 }

+ 3 - 3
DialogX/src/main/java/com/kongzue/dialogx/dialogs/CustomDialog.java

@@ -88,7 +88,7 @@ public class CustomDialog extends BaseDialog {
         super.beforeShow();
         dialogView = createView(R.layout.layout_dialogx_custom);
         dialogImpl = new DialogImpl(dialogView);
-        dialogView.setTag(dialogKey());
+        dialogView.setTag(me);
         show(dialogView);
     }
     
@@ -96,7 +96,7 @@ public class CustomDialog extends BaseDialog {
         super.beforeShow();
         dialogView = createView(R.layout.layout_dialogx_custom);
         dialogImpl = new DialogImpl(dialogView);
-        dialogView.setTag(dialogKey());
+        dialogView.setTag(me);
         show(activity, dialogView);
     }
     
@@ -471,7 +471,7 @@ public class CustomDialog extends BaseDialog {
         enterAnimDuration = 0;
         dialogView = createView(R.layout.layout_dialogx_custom);
         dialogImpl = new DialogImpl(dialogView);
-        dialogView.setTag(dialogKey());
+        dialogView.setTag(me);
         show(dialogView);
     }
 }

+ 3 - 3
DialogX/src/main/java/com/kongzue/dialogx/dialogs/FullScreenDialog.java

@@ -75,7 +75,7 @@ public class FullScreenDialog extends BaseDialog {
         super.beforeShow();
         dialogView = createView(isLightTheme() ? R.layout.layout_dialogx_fullscreen : R.layout.layout_dialogx_fullscreen_dark);
         dialogImpl = new DialogImpl(dialogView);
-        dialogView.setTag(dialogKey());
+        dialogView.setTag(me);
         show(dialogView);
     }
     
@@ -83,7 +83,7 @@ public class FullScreenDialog extends BaseDialog {
         super.beforeShow();
         dialogView = createView(isLightTheme() ? R.layout.layout_dialogx_fullscreen : R.layout.layout_dialogx_fullscreen_dark);
         dialogImpl = new DialogImpl(dialogView);
-        dialogView.setTag(dialogKey());
+        dialogView.setTag(me);
         show(activity, dialogView);
     }
     
@@ -401,7 +401,7 @@ public class FullScreenDialog extends BaseDialog {
         enterAnimDuration = 0;
         dialogView = createView(isLightTheme() ? R.layout.layout_dialogx_fullscreen : R.layout.layout_dialogx_fullscreen_dark);
         dialogImpl = new DialogImpl(dialogView);
-        dialogView.setTag(dialogKey());
+        dialogView.setTag(me);
         show(dialogView);
     }
 }

+ 1 - 1
DialogX/src/main/java/com/kongzue/dialogx/dialogs/InputDialog.java

@@ -543,7 +543,7 @@ public class InputDialog extends MessageDialog {
         enterAnimDuration = 0;
         dialogView = createView(layoutId);
         dialogImpl = new DialogImpl(dialogView);
-        dialogView.setTag(dialogKey());
+        dialogView.setTag(me);
         show(dialogView);
         setInputText(inputText);
     }

+ 3 - 3
DialogX/src/main/java/com/kongzue/dialogx/dialogs/MessageDialog.java

@@ -204,7 +204,7 @@ public class MessageDialog extends BaseDialog {
         
         dialogView = createView(layoutId);
         dialogImpl = new DialogImpl(dialogView);
-        dialogView.setTag(dialogKey());
+        dialogView.setTag(me);
         show(dialogView);
     }
     
@@ -215,7 +215,7 @@ public class MessageDialog extends BaseDialog {
         
         dialogView = createView(layoutId);
         dialogImpl = new DialogImpl(dialogView);
-        dialogView.setTag(dialogKey());
+        dialogView.setTag(me);
         show(activity, dialogView);
     }
     
@@ -1029,7 +1029,7 @@ public class MessageDialog extends BaseDialog {
         enterAnimDuration = 0;
         dialogView = createView(layoutId);
         dialogImpl = new DialogImpl(dialogView);
-        dialogView.setTag(dialogKey());
+        dialogView.setTag(me);
         show(dialogView);
     }
 }

+ 3 - 3
DialogX/src/main/java/com/kongzue/dialogx/dialogs/PopTip.java

@@ -278,7 +278,7 @@ public class PopTip extends BaseDialog {
         }
         dialogView = createView(layoutResId);
         dialogImpl = new DialogImpl(dialogView);
-        dialogView.setTag(dialogKey());
+        dialogView.setTag(me);
         show(dialogView);
     }
     
@@ -314,7 +314,7 @@ public class PopTip extends BaseDialog {
         }
         dialogView = createView(layoutResId);
         dialogImpl = new DialogImpl(dialogView);
-        dialogView.setTag(dialogKey());
+        dialogView.setTag(me);
         show(activity, dialogView);
     }
     
@@ -845,7 +845,7 @@ public class PopTip extends BaseDialog {
         enterAnimDuration = 0;
         dialogView = createView(layoutResId);
         dialogImpl = new DialogImpl(dialogView);
-        dialogView.setTag(dialogKey());
+        dialogView.setTag(me);
         show(dialogView);
     }
 }

+ 2 - 2
DialogX/src/main/java/com/kongzue/dialogx/dialogs/WaitDialog.java

@@ -258,7 +258,7 @@ public class WaitDialog extends BaseDialog {
                 }
                 dialogView = createView(layoutResId);
                 dialogImpl = new DialogImpl(dialogView);
-                dialogView.setTag(dialogKey());
+                dialogView.setTag(me.get());
                 show(dialogView);
             }
         });
@@ -276,7 +276,7 @@ public class WaitDialog extends BaseDialog {
                 }
                 dialogView = createView(layoutResId);
                 dialogImpl = new DialogImpl(dialogView);
-                dialogView.setTag(dialogKey());
+                dialogView.setTag(me.get());
                 show(activity, dialogView);
             }
         });

+ 6 - 2
DialogX/src/main/java/com/kongzue/dialogx/impl/ActivityLifecycleImpl.java

@@ -4,6 +4,7 @@ import android.app.Activity;
 import android.app.Application;
 import android.content.Context;
 import android.os.Bundle;
+import android.util.Log;
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
@@ -55,12 +56,10 @@ public class ActivityLifecycleImpl implements Application.ActivityLifecycleCallb
     
     @Override
     public void onActivityPaused(@NonNull Activity activity) {
-    
     }
     
     @Override
     public void onActivityStopped(@NonNull Activity activity) {
-    
     }
     
     @Override
@@ -75,6 +74,11 @@ public class ActivityLifecycleImpl implements Application.ActivityLifecycleCallb
         }
     }
     
+    @Override
+    public void onActivityPreDestroyed(@NonNull Activity activity) {
+        BaseDialog.recycleDialog(activity);
+    }
+    
     public interface onActivityResumeCallBack {
         void getActivity(Activity activity);
     }

+ 111 - 31
DialogX/src/main/java/com/kongzue/dialogx/interfaces/BaseDialog.java

@@ -14,6 +14,7 @@ import android.util.TypedValue;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
+import android.view.WindowManager;
 import android.widget.FrameLayout;
 import android.widget.LinearLayout;
 import android.widget.TextView;
@@ -22,10 +23,15 @@ import androidx.annotation.ColorRes;
 import androidx.appcompat.app.AppCompatDelegate;
 
 import com.kongzue.dialogx.DialogX;
+import com.kongzue.dialogx.dialogs.PopTip;
 import com.kongzue.dialogx.impl.ActivityLifecycleImpl;
 import com.kongzue.dialogx.util.TextInfo;
+import com.kongzue.dialogx.util.WindowUtil;
 
 import java.lang.ref.WeakReference;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.CopyOnWriteArrayList;
 
 import static com.kongzue.dialogx.DialogX.DEBUGMODE;
 
@@ -40,6 +46,9 @@ public abstract class BaseDialog {
     
     private static WeakReference<FrameLayout> rootFrameLayout;
     private static WeakReference<Activity> contextWeakReference;
+    protected WeakReference<Activity> ownActivity;
+    private static List<BaseDialog> runningDialogList;
+    private WeakReference<View> dialogView;
     
     public static void init(Context context) {
         ActivityLifecycleImpl.init(context, new ActivityLifecycleImpl.onActivityResumeCallBack() {
@@ -66,49 +75,99 @@ public abstract class BaseDialog {
     public abstract void onUIModeChange(Configuration newConfig);
     
     protected static void show(final View view) {
-        if (rootFrameLayout == null || view == null || rootFrameLayout.get() == null) return;
-        log(view.getTag() + ".show");
+        if (view == null) return;
+        final BaseDialog baseDialog = (BaseDialog) view.getTag();
+        baseDialog.ownActivity = new WeakReference<>(contextWeakReference.get());
+        baseDialog.dialogView = new WeakReference<>(view);
         
-        runOnMain(new Runnable() {
-            @Override
-            public void run() {
-                rootFrameLayout.get().addView(view);
-            }
-        });
+        log(baseDialog.dialogKey() + ".show");
+        addDialogToRunningList(baseDialog);
+        if (DialogX.implIMPLMode == DialogX.IMPL_MODE.VIEW) {
+            if (rootFrameLayout == null || rootFrameLayout.get() == null) return;
+            runOnMain(new Runnable() {
+                @Override
+                public void run() {
+                    rootFrameLayout.get().addView(view);
+                }
+            });
+        } else {
+            runOnMain(new Runnable() {
+                @Override
+                public void run() {
+                    WindowUtil.show(contextWeakReference.get(), view, !(baseDialog instanceof PopTip));
+                }
+            });
+        }
     }
     
-    protected static void show(Activity activity, final View view) {
+    protected static void show(final Activity activity, final View view) {
         if (activity == null || view == null) return;
         if (activity.isDestroyed()) {
-            error(view.getTag() + ".show ERROR: activity is Destroyed.");
-            return;
-        }
-        log(view.getTag() + ".show");
-        final FrameLayout activityRootView = (FrameLayout) activity.getWindow().getDecorView();
-        if (activityRootView == null) {
+            error(((BaseDialog) view.getTag()).dialogKey() + ".show ERROR: activity is Destroyed.");
             return;
         }
-        runOnMain(new Runnable() {
-            @Override
-            public void run() {
-                activityRootView.addView(view);
+        final BaseDialog baseDialog = (BaseDialog) view.getTag();
+        baseDialog.ownActivity = new WeakReference<>(activity);
+        baseDialog.dialogView = new WeakReference<>(view);
+        
+        log(baseDialog + ".show");
+        addDialogToRunningList(baseDialog);
+        if (DialogX.implIMPLMode == DialogX.IMPL_MODE.VIEW) {
+            final FrameLayout activityRootView = (FrameLayout) activity.getWindow().getDecorView();
+            if (activityRootView == null) {
+                return;
             }
-        });
+            runOnMain(new Runnable() {
+                @Override
+                public void run() {
+                    activityRootView.addView(view);
+                }
+            });
+        } else {
+            runOnMain(new Runnable() {
+                @Override
+                public void run() {
+                    WindowUtil.show(activity, view, !(baseDialog instanceof PopTip));
+                }
+            });
+        }
     }
     
     protected static void dismiss(final View dialogView) {
-        log(dialogView.getTag() + ".dismiss");
-        if (rootFrameLayout == null || dialogView == null) return;
-        runOnMain(new Runnable() {
-            @Override
-            public void run() {
-                if (dialogView.getParent() == null || !(dialogView.getParent() instanceof ViewGroup)) {
-                    rootFrameLayout.get().removeView(dialogView);
-                } else {
-                    ((ViewGroup) dialogView.getParent()).removeView(dialogView);
+        if (dialogView == null) return;
+        final BaseDialog baseDialog = (BaseDialog) dialogView.getTag();
+        log(baseDialog.dialogKey() + ".dismiss");
+        removeDialogToRunningList(baseDialog);
+        if (baseDialog.dialogView != null) baseDialog.dialogView.clear();
+        if (DialogX.implIMPLMode == DialogX.IMPL_MODE.VIEW) {
+            if (rootFrameLayout == null) return;
+            runOnMain(new Runnable() {
+                @Override
+                public void run() {
+                    if (dialogView.getParent() == null || !(dialogView.getParent() instanceof ViewGroup)) {
+                        rootFrameLayout.get().removeView(dialogView);
+                    } else {
+                        ((ViewGroup) dialogView.getParent()).removeView(dialogView);
+                    }
                 }
-            }
-        });
+            });
+        } else {
+            runOnMain(new Runnable() {
+                @Override
+                public void run() {
+                    WindowUtil.dismiss(dialogView);
+                }
+            });
+        }
+    }
+    
+    private static void addDialogToRunningList(BaseDialog baseDialog) {
+        if (runningDialogList == null) runningDialogList = new ArrayList<>();
+        runningDialogList.add(baseDialog);
+    }
+    
+    private static void removeDialogToRunningList(BaseDialog baseDialog) {
+        if (runningDialogList != null) runningDialogList.remove(baseDialog);
     }
     
     public static Context getContext() {
@@ -275,4 +334,25 @@ public abstract class BaseDialog {
         if (!DialogX.autoRunOnUIThread) runnable.run();
         new Handler(Looper.getMainLooper()).post(runnable);
     }
+    
+    public Activity getActivity() {
+        return ownActivity == null ? null : ownActivity.get();
+    }
+    
+    protected void cleanActivityContext() {
+        if (ownActivity != null) ownActivity.clear();
+    }
+    
+    public static void recycleDialog(Activity activity) {
+        if (DialogX.implIMPLMode == DialogX.IMPL_MODE.WINDOW){
+            if (runningDialogList != null) {
+                CopyOnWriteArrayList<BaseDialog> copyOnWriteList = new CopyOnWriteArrayList<>(runningDialogList);
+                for (BaseDialog baseDialog : copyOnWriteList) {
+                    if (baseDialog.getActivity() == activity && baseDialog.dialogView != null) {
+                        WindowUtil.dismiss(baseDialog.dialogView.get());
+                    }
+                }
+            }
+        }
+    }
 }

+ 73 - 0
DialogX/src/main/java/com/kongzue/dialogx/util/WindowUtil.java

@@ -0,0 +1,73 @@
+package com.kongzue.dialogx.util;
+
+import android.app.Activity;
+import android.content.Context;
+import android.graphics.PixelFormat;
+import android.os.Build;
+import android.util.Log;
+import android.view.Gravity;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.WindowManager;
+import android.widget.Toast;
+
+import com.kongzue.dialogx.R;
+import com.kongzue.dialogx.interfaces.BaseDialog;
+
+import static android.view.WindowManager.LayoutParams.*;
+
+/**
+ * @author: Kongzue
+ * @github: https://github.com/kongzue/
+ * @homepage: http://kongzue.com/
+ * @mail: myzcxhh@live.cn
+ * @createTime: 2021/4/29 16:02
+ */
+public class WindowUtil {
+    
+    public static void show(Activity activity, View dialogView, boolean touchEnable) {
+        WindowManager manager = (WindowManager) activity.getSystemService(Context.WINDOW_SERVICE);
+        WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams();
+        
+        layoutParams.gravity = Gravity.CENTER_VERTICAL;
+        layoutParams.format = PixelFormat.TRANSPARENT;
+        layoutParams.type = TYPE_APPLICATION_ATTACHED_DIALOG;
+        layoutParams.flags = FLAG_FULLSCREEN |
+                FLAG_TRANSLUCENT_STATUS |
+                FLAG_TRANSLUCENT_NAVIGATION |
+                FLAG_LAYOUT_IN_SCREEN
+        ;
+        if (!touchEnable) {
+            layoutParams.flags = layoutParams.flags | FLAG_NOT_FOCUSABLE;
+
+//            ViewGroup boxRoot = dialogView.findViewById(R.id.box_root);
+//            ViewGroup boxBody = dialogView.findViewById(R.id.box_body);
+//            if (boxBody != null && boxRoot != null) {
+//                boxRoot.removeView(boxBody);
+//                dialogView = boxBody;
+//
+//                layoutParams.width = 300;
+//                layoutParams.height = 85;
+//            }
+//            int paddingValue = (int) boxBody.getElevation();
+//            layoutParams.width = WRAP_CONTENT;
+//            layoutParams.height = WRAP_CONTENT;
+//            boxRoot.setPadding(100, 0, 100, 100);
+
+//            boxRoot.setFocusable(false);
+        }
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
+            layoutParams.layoutInDisplayCutoutMode = LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES;
+        }
+        
+        manager.addView(dialogView, layoutParams);
+    }
+    
+    public static void dismiss(View dialogView) {
+        BaseDialog baseDialog = (BaseDialog) dialogView.getTag();
+        if (baseDialog != null && baseDialog.getActivity() != null) {
+            WindowManager manager = (WindowManager) baseDialog.getActivity().getSystemService(Context.WINDOW_SERVICE);
+            manager.removeView(dialogView);
+        }
+    }
+}

+ 1 - 1
DialogX/src/main/java/com/kongzue/dialogx/util/views/DialogXBaseRelativeLayout.java

@@ -128,7 +128,7 @@ public class DialogXBaseRelativeLayout extends RelativeLayout {
         super.onAttachedToWindow();
         final ViewParent parent = getParent();
         
-        ViewCompat.setFitsSystemWindows(this, ViewCompat.getFitsSystemWindows((View) parent));
+        if (parent instanceof View)ViewCompat.setFitsSystemWindows(this, ViewCompat.getFitsSystemWindows((View) parent));
         ViewCompat.requestApplyInsets(this);
         
         if (BaseDialog.getContext() == null) return;

+ 1 - 0
app/src/main/java/com/kongzue/dialogxdemo/App.java

@@ -24,6 +24,7 @@ public class App extends BaseApp<App> {
     @Override
     public void init() {
         DialogX.init(this);
+        DialogX.implIMPLMode= DialogX.IMPL_MODE.VIEW;
         DialogX.globalStyle = new MaterialStyle() {
             @Override
             public PopTipSettings popTipSettings() {

+ 4 - 12
app/src/main/java/com/kongzue/dialogxdemo/MainActivity.java

@@ -5,11 +5,14 @@ import android.content.Context;
 import android.content.Intent;
 import android.content.res.Configuration;
 import android.graphics.Color;
+import android.graphics.PixelFormat;
 import android.net.Uri;
 import android.os.Handler;
 import android.os.Looper;
 import android.util.Log;
+import android.view.Gravity;
 import android.view.View;
+import android.view.WindowManager;
 import android.view.inputmethod.InputMethodManager;
 import android.webkit.WebSettings;
 import android.webkit.WebView;
@@ -58,6 +61,7 @@ import com.kongzue.dialogx.style.MIUIStyle;
 import com.kongzue.dialogx.style.MaterialStyle;
 import com.kongzue.dialogx.util.InputInfo;
 import com.kongzue.dialogx.util.TextInfo;
+import com.kongzue.dialogx.util.WindowUtil;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -168,18 +172,6 @@ public class MainActivity extends BaseActivity {
                             runDelayed(new Runnable() {
                                 @Override
                                 public void run() {
-                                    new Thread() {
-                                        @Override
-                                        public void run() {
-                                            try {
-                                                //模拟2秒后启动 WaitDialog
-                                                sleep(2000);
-                                                WaitDialog.show(MainActivity.this, "Hello!");
-                                            } catch (Exception e) {
-                                                e.printStackTrace();
-                                            }
-                                        }
-                                    }.start();
                                     finish();       //先结束掉本界面
                                 }
                             }, 2000);

+ 1 - 1
gradle.properties

@@ -18,5 +18,5 @@ android.useAndroidX=true
 # Automatically convert third-party libraries to use AndroidX
 android.enableJetifier=true
 
-BUILD_VERSION=0.0.37.beta6
+BUILD_VERSION=0.0.37.alpha7
 BUILD_VERSION_INT=37