Przeglądaj źródła

- 添加MessageMenu对话框。

14487 10 miesięcy temu
rodzic
commit
993e0e4190
36 zmienionych plików z 2119 dodań i 120 usunięć
  1. 12 12
      DialogX/src/main/java/com/kongzue/dialogx/dialogs/BottomDialog.java
  2. 27 30
      DialogX/src/main/java/com/kongzue/dialogx/dialogs/BottomMenu.java
  3. 39 3
      DialogX/src/main/java/com/kongzue/dialogx/dialogs/MessageDialog.java
  4. 1546 0
      DialogX/src/main/java/com/kongzue/dialogx/dialogs/MessageMenu.java
  5. 1 1
      DialogX/src/main/java/com/kongzue/dialogx/interfaces/OnMenuButtonClickListener.java
  6. 5 0
      DialogX/src/main/java/com/kongzue/dialogx/interfaces/SELECT_MODE.java
  7. 5 4
      DialogX/src/main/java/com/kongzue/dialogx/util/BottomMenuArrayAdapter.java
  8. 255 0
      DialogX/src/main/java/com/kongzue/dialogx/util/MessageMenuArrayAdapter.java
  9. 9 9
      DialogX/src/main/java/com/kongzue/dialogx/util/views/DialogListView.java
  10. 5 5
      DialogX/src/main/java/com/kongzue/dialogx/util/views/DialogScrollView.java
  11. 2 2
      DialogX/src/main/res/layout/layout_dialogx_bottom_material.xml
  12. 2 2
      DialogX/src/main/res/layout/layout_dialogx_bottom_material_dark.xml
  13. 9 2
      DialogX/src/main/res/layout/layout_dialogx_material.xml
  14. 8 2
      DialogX/src/main/res/layout/layout_dialogx_material_dark.xml
  15. 2 2
      DialogXIOSStyle/src/main/res/layout/layout_dialogx_bottom_ios.xml
  16. 2 2
      DialogXIOSStyle/src/main/res/layout/layout_dialogx_bottom_ios_dark.xml
  17. 9 2
      DialogXIOSStyle/src/main/res/layout/layout_dialogx_ios.xml
  18. 11 4
      DialogXIOSStyle/src/main/res/layout/layout_dialogx_ios_dark.xml
  19. 2 2
      DialogXKongzueStyle/src/main/res/layout/layout_dialogx_bottom_kongzue.xml
  20. 2 2
      DialogXKongzueStyle/src/main/res/layout/layout_dialogx_bottom_kongzue_dark.xml
  21. 9 2
      DialogXKongzueStyle/src/main/res/layout/layout_dialogx_kongzue.xml
  22. 9 2
      DialogXKongzueStyle/src/main/res/layout/layout_dialogx_kongzue_dark.xml
  23. 2 2
      DialogXMIUIStyle/src/main/res/layout/layout_dialogx_bottom_miui.xml
  24. 2 2
      DialogXMIUIStyle/src/main/res/layout/layout_dialogx_bottom_miui_dark.xml
  25. 9 2
      DialogXMIUIStyle/src/main/res/layout/layout_dialogx_miui.xml
  26. 8 2
      DialogXMIUIStyle/src/main/res/layout/layout_dialogx_miui_dark.xml
  27. 2 2
      DialogXMaterialYou/src/main/res/layout/layout_dialogx_bottom_material_you.xml
  28. 2 2
      DialogXMaterialYou/src/main/res/layout/layout_dialogx_bottom_material_you_dark.xml
  29. 13 7
      DialogXMaterialYou/src/main/res/layout/layout_dialogx_material_you.xml
  30. 7 2
      DialogXMaterialYou/src/main/res/layout/layout_dialogx_material_you_dark.xml
  31. 65 5
      app/src/main/java/com/kongzue/dialogxdemo/activity/MainActivity.java
  32. 3 2
      app/src/main/java/com/kongzue/dialogxdemo/custom/recycleview/CustomRecycleView.java
  33. 33 0
      app/src/main/res/layout/activity_main.xml
  34. BIN
      app/src/main/res/mipmap-xxhdpi/img_button_messagemenu.png
  35. 1 1
      gradle.properties
  36. 1 1
      gradle/wrapper/gradle-wrapper.properties

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

@@ -39,12 +39,12 @@ import com.kongzue.dialogx.interfaces.DialogXStyle;
 import com.kongzue.dialogx.interfaces.OnBackPressedListener;
 import com.kongzue.dialogx.interfaces.OnBackgroundMaskClickListener;
 import com.kongzue.dialogx.interfaces.OnBindView;
-import com.kongzue.dialogx.interfaces.OnBottomMenuButtonClickListener;
+import com.kongzue.dialogx.interfaces.OnMenuButtonClickListener;
 import com.kongzue.dialogx.interfaces.OnDialogButtonClickListener;
 import com.kongzue.dialogx.interfaces.ScrollController;
 import com.kongzue.dialogx.util.BottomDialogTouchEventInterceptor;
 import com.kongzue.dialogx.util.TextInfo;
-import com.kongzue.dialogx.util.views.BottomDialogScrollView;
+import com.kongzue.dialogx.util.views.DialogScrollView;
 import com.kongzue.dialogx.util.views.DialogXBaseRelativeLayout;
 import com.kongzue.dialogx.util.views.MaxRelativeLayout;
 
@@ -396,8 +396,8 @@ public class BottomDialog extends BaseDialog implements DialogXBaseBottomDialog
                                 if (!((OnDialogButtonClickListener) cancelButtonClickListener).onClick(me, v)) {
                                     dismiss();
                                 }
-                            } else if (cancelButtonClickListener instanceof OnBottomMenuButtonClickListener) {
-                                if (!((OnBottomMenuButtonClickListener) cancelButtonClickListener).onClick(me, v)) {
+                            } else if (cancelButtonClickListener instanceof OnMenuButtonClickListener) {
+                                if (!((OnMenuButtonClickListener) cancelButtonClickListener).onClick(me, v)) {
                                     dismiss();
                                 }
                             }
@@ -418,8 +418,8 @@ public class BottomDialog extends BaseDialog implements DialogXBaseBottomDialog
                                 if (!((OnDialogButtonClickListener) otherButtonClickListener).onClick(me, v)) {
                                     dismiss();
                                 }
-                            } else if (otherButtonClickListener instanceof OnBottomMenuButtonClickListener) {
-                                if (!((OnBottomMenuButtonClickListener) otherButtonClickListener).onClick(me, v)) {
+                            } else if (otherButtonClickListener instanceof OnMenuButtonClickListener) {
+                                if (!((OnMenuButtonClickListener) otherButtonClickListener).onClick(me, v)) {
                                     dismiss();
                                 }
                             }
@@ -440,8 +440,8 @@ public class BottomDialog extends BaseDialog implements DialogXBaseBottomDialog
                                 if (!((OnDialogButtonClickListener) okButtonClickListener).onClick(me, v)) {
                                     dismiss();
                                 }
-                            } else if (okButtonClickListener instanceof OnBottomMenuButtonClickListener) {
-                                if (!((OnBottomMenuButtonClickListener) okButtonClickListener).onClick(me, v)) {
+                            } else if (okButtonClickListener instanceof OnMenuButtonClickListener) {
+                                if (!((OnMenuButtonClickListener) okButtonClickListener).onClick(me, v)) {
                                     dismiss();
                                 }
                             }
@@ -599,15 +599,15 @@ public class BottomDialog extends BaseDialog implements DialogXBaseBottomDialog
             if (onBindView != null && onBindView.getCustomView() != null) {
                 onBindView.bindParent(boxCustom, me);
                 if (onBindView.getCustomView() instanceof ScrollController) {
-                    if (scrollView instanceof BottomDialogScrollView) {
-                        ((BottomDialogScrollView) scrollView).setVerticalScrollBarEnabled(false);
+                    if (scrollView instanceof DialogScrollView) {
+                        ((DialogScrollView) scrollView).setVerticalScrollBarEnabled(false);
                     }
                     scrollView = (ScrollController) onBindView.getCustomView();
                 } else {
                     View scrollController = onBindView.getCustomView().findViewWithTag("ScrollController");
                     if (scrollController instanceof ScrollController) {
-                        if (scrollView instanceof BottomDialogScrollView) {
-                            ((BottomDialogScrollView) scrollView).setVerticalScrollBarEnabled(false);
+                        if (scrollView instanceof DialogScrollView) {
+                            ((DialogScrollView) scrollView).setVerticalScrollBarEnabled(false);
                         }
                         scrollView = (ScrollController) scrollController;
                     }

+ 27 - 30
DialogX/src/main/java/com/kongzue/dialogx/dialogs/BottomMenu.java

@@ -28,14 +28,15 @@ import com.kongzue.dialogx.interfaces.MenuItemTextInfoInterceptor;
 import com.kongzue.dialogx.interfaces.OnBackPressedListener;
 import com.kongzue.dialogx.interfaces.OnBackgroundMaskClickListener;
 import com.kongzue.dialogx.interfaces.OnBindView;
-import com.kongzue.dialogx.interfaces.OnBottomMenuButtonClickListener;
+import com.kongzue.dialogx.interfaces.OnMenuButtonClickListener;
 import com.kongzue.dialogx.interfaces.OnDialogButtonClickListener;
 import com.kongzue.dialogx.interfaces.OnIconChangeCallBack;
 import com.kongzue.dialogx.interfaces.OnMenuItemClickListener;
 import com.kongzue.dialogx.interfaces.OnMenuItemSelectListener;
+import com.kongzue.dialogx.interfaces.SELECT_MODE;
 import com.kongzue.dialogx.util.BottomMenuArrayAdapter;
 import com.kongzue.dialogx.util.TextInfo;
-import com.kongzue.dialogx.util.views.BottomDialogListView;
+import com.kongzue.dialogx.util.views.DialogListView;
 
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -52,10 +53,6 @@ import java.util.Map;
  */
 public class BottomMenu extends BottomDialog {
 
-    public enum SELECT_MODE {
-        NONE, SINGLE, MULTIPLE
-    }
-
     protected BottomMenu me = this;
     protected int selectionIndex = -1;
     protected SELECT_MODE selectMode = SELECT_MODE.NONE;
@@ -84,7 +81,7 @@ public class BottomMenu extends BottomDialog {
 
     protected OnIconChangeCallBack<BottomMenu> onIconChangeCallBack;
     protected MenuItemTextInfoInterceptor<BottomMenu> menuItemTextInfoInterceptor;
-    protected BottomDialogListView listView;
+    protected DialogListView listView;
     protected BaseAdapter menuListAdapter;
     protected List<CharSequence> menuList;
     protected List<Integer> iconResIds;
@@ -511,9 +508,9 @@ public class BottomMenu extends BottomDialog {
 
 
             if (!isLightTheme()) {
-                listView = new BottomDialogListView(getDialogImpl(), getOwnActivity(), R.style.DialogXCompatThemeDark);
+                listView = new DialogListView(getDialogImpl(), getOwnActivity(), R.style.DialogXCompatThemeDark);
             } else {
-                listView = new BottomDialogListView(getDialogImpl(), getOwnActivity());
+                listView = new DialogListView(getDialogImpl(), getOwnActivity());
             }
             listView.setOverScrollMode(OVER_SCROLL_NEVER);
             listView.setDivider(getResources().getDrawable(dividerDrawableResId));
@@ -832,19 +829,19 @@ public class BottomMenu extends BottomDialog {
         return this;
     }
 
-    public BottomMenu setCancelButton(OnBottomMenuButtonClickListener<BottomMenu> cancelButtonClickListener) {
+    public BottomMenu setCancelButton(OnMenuButtonClickListener<BottomMenu> cancelButtonClickListener) {
         this.cancelButtonClickListener = cancelButtonClickListener;
         return this;
     }
 
-    public BottomMenu setCancelButton(CharSequence cancelText, OnBottomMenuButtonClickListener<BottomMenu> cancelButtonClickListener) {
+    public BottomMenu setCancelButton(CharSequence cancelText, OnMenuButtonClickListener<BottomMenu> cancelButtonClickListener) {
         this.cancelText = cancelText;
         this.cancelButtonClickListener = cancelButtonClickListener;
         preRefreshUI();
         return this;
     }
 
-    public BottomMenu setCancelButton(int cancelTextResId, OnBottomMenuButtonClickListener<BottomMenu> cancelButtonClickListener) {
+    public BottomMenu setCancelButton(int cancelTextResId, OnMenuButtonClickListener<BottomMenu> cancelButtonClickListener) {
         this.cancelText = getString(cancelTextResId);
         this.cancelButtonClickListener = cancelButtonClickListener;
         preRefreshUI();
@@ -852,7 +849,7 @@ public class BottomMenu extends BottomDialog {
     }
 
     /**
-     * 建议使用 {@link com.kongzue.dialogx.dialogs.BottomMenu#setCancelButton(OnBottomMenuButtonClickListener<BottomMenu>)}
+     * 建议使用 {@link com.kongzue.dialogx.dialogs.BottomMenu#setCancelButton(OnMenuButtonClickListener <BottomMenu>)}
      */
     @Deprecated
     public BottomMenu setCancelButton(OnDialogButtonClickListener<BottomDialog> cancelButtonClickListener) {
@@ -861,7 +858,7 @@ public class BottomMenu extends BottomDialog {
     }
 
     /**
-     * 建议使用 {@link com.kongzue.dialogx.dialogs.BottomMenu#setCancelButton(CharSequence cancelText, OnBottomMenuButtonClickListener<BottomMenu>)}
+     * 建议使用 {@link com.kongzue.dialogx.dialogs.BottomMenu#setCancelButton(CharSequence cancelText, OnMenuButtonClickListener <BottomMenu>)}
      */
     @Deprecated
     public BottomMenu setCancelButton(CharSequence cancelText, OnDialogButtonClickListener<BottomDialog> cancelButtonClickListener) {
@@ -872,7 +869,7 @@ public class BottomMenu extends BottomDialog {
     }
 
     /**
-     * 建议使用 {@link com.kongzue.dialogx.dialogs.BottomMenu#setCancelButton(int cancelTextResId, OnBottomMenuButtonClickListener<BottomMenu>)}
+     * 建议使用 {@link com.kongzue.dialogx.dialogs.BottomMenu#setCancelButton(int cancelTextResId, OnMenuButtonClickListener <BottomMenu>)}
      */
     @Deprecated
     public BottomMenu setCancelButton(int cancelTextResId, OnDialogButtonClickListener<BottomDialog> cancelButtonClickListener) {
@@ -936,11 +933,11 @@ public class BottomMenu extends BottomDialog {
         return this;
     }
 
-    public OnBottomMenuButtonClickListener<BottomMenu> getBottomMenuCancelButtonClickListener() {
-        return (OnBottomMenuButtonClickListener<BottomMenu>) cancelButtonClickListener;
+    public OnMenuButtonClickListener<BottomMenu> getBottomMenuCancelButtonClickListener() {
+        return (OnMenuButtonClickListener<BottomMenu>) cancelButtonClickListener;
     }
 
-    public BottomMenu setCancelButtonClickListener(OnBottomMenuButtonClickListener<BottomMenu> cancelButtonClickListener) {
+    public BottomMenu setCancelButtonClickListener(OnMenuButtonClickListener<BottomMenu> cancelButtonClickListener) {
         this.cancelButtonClickListener = cancelButtonClickListener;
         return this;
     }
@@ -1074,18 +1071,18 @@ public class BottomMenu extends BottomDialog {
         return this;
     }
 
-    public BottomMenu setOkButton(OnBottomMenuButtonClickListener<BottomMenu> okButtonClickListener) {
+    public BottomMenu setOkButton(OnMenuButtonClickListener<BottomMenu> okButtonClickListener) {
         this.okButtonClickListener = okButtonClickListener;
         return this;
     }
 
-    public BottomMenu setOkButton(CharSequence okText, OnBottomMenuButtonClickListener<BottomMenu> okButtonClickListener) {
+    public BottomMenu setOkButton(CharSequence okText, OnMenuButtonClickListener<BottomMenu> okButtonClickListener) {
         this.okText = okText;
         this.okButtonClickListener = okButtonClickListener;
         return this;
     }
 
-    public BottomMenu setOkButton(int okTextResId, OnBottomMenuButtonClickListener<BottomMenu> okButtonClickListener) {
+    public BottomMenu setOkButton(int okTextResId, OnMenuButtonClickListener<BottomMenu> okButtonClickListener) {
         this.okText = getString(okTextResId);
         this.okButtonClickListener = okButtonClickListener;
         return this;
@@ -1097,7 +1094,7 @@ public class BottomMenu extends BottomDialog {
     }
 
     /**
-     * 建议使用 {@link com.kongzue.dialogx.dialogs.BottomMenu#setOkButton(OnBottomMenuButtonClickListener<BottomMenu>)}
+     * 建议使用 {@link com.kongzue.dialogx.dialogs.BottomMenu#setOkButton(OnMenuButtonClickListener <BottomMenu>)}
      */
     @Deprecated
     public BottomMenu setOkButton(OnDialogButtonClickListener<BottomDialog> okButtonClickListener) {
@@ -1106,7 +1103,7 @@ public class BottomMenu extends BottomDialog {
     }
 
     /**
-     * 建议使用 {@link com.kongzue.dialogx.dialogs.BottomMenu#setOkButton(CharSequence okText, OnBottomMenuButtonClickListener<BottomMenu>)}
+     * 建议使用 {@link com.kongzue.dialogx.dialogs.BottomMenu#setOkButton(CharSequence okText, OnMenuButtonClickListener <BottomMenu>)}
      */
     @Deprecated
     public BottomMenu setOkButton(CharSequence okText, OnDialogButtonClickListener<BottomDialog> okButtonClickListener) {
@@ -1116,7 +1113,7 @@ public class BottomMenu extends BottomDialog {
     }
 
     /**
-     * 建议使用 {@link com.kongzue.dialogx.dialogs.BottomMenu#setOkButton(int okTextResId, OnBottomMenuButtonClickListener<BottomMenu>)}
+     * 建议使用 {@link com.kongzue.dialogx.dialogs.BottomMenu#setOkButton(int okTextResId, OnMenuButtonClickListener <BottomMenu>)}
      */
     @Deprecated
     public BottomMenu setOkButton(int okTextResId, OnDialogButtonClickListener<BottomDialog> okButtonClickListener) {
@@ -1141,25 +1138,25 @@ public class BottomMenu extends BottomDialog {
         return this;
     }
 
-    public BottomMenu setOtherButton(OnBottomMenuButtonClickListener<BottomMenu> otherButtonClickListener) {
+    public BottomMenu setOtherButton(OnMenuButtonClickListener<BottomMenu> otherButtonClickListener) {
         this.otherButtonClickListener = otherButtonClickListener;
         return this;
     }
 
-    public BottomMenu setOtherButton(CharSequence otherText, OnBottomMenuButtonClickListener<BottomMenu> otherButtonClickListener) {
+    public BottomMenu setOtherButton(CharSequence otherText, OnMenuButtonClickListener<BottomMenu> otherButtonClickListener) {
         this.otherText = otherText;
         this.otherButtonClickListener = otherButtonClickListener;
         return this;
     }
 
-    public BottomMenu setOtherButton(int otherTextResId, OnBottomMenuButtonClickListener<BottomMenu> otherButtonClickListener) {
+    public BottomMenu setOtherButton(int otherTextResId, OnMenuButtonClickListener<BottomMenu> otherButtonClickListener) {
         this.otherText = getString(otherTextResId);
         this.otherButtonClickListener = otherButtonClickListener;
         return this;
     }
 
     /**
-     * 建议使用 {@link com.kongzue.dialogx.dialogs.BottomMenu#setOtherButton(OnBottomMenuButtonClickListener<BottomMenu>)}
+     * 建议使用 {@link com.kongzue.dialogx.dialogs.BottomMenu#setOtherButton(OnMenuButtonClickListener <BottomMenu>)}
      */
     @Deprecated
     public BottomMenu setOtherButton(OnDialogButtonClickListener<BottomDialog> otherButtonClickListener) {
@@ -1168,7 +1165,7 @@ public class BottomMenu extends BottomDialog {
     }
 
     /**
-     * 建议使用 {@link com.kongzue.dialogx.dialogs.BottomMenu#setOtherButton(CharSequence otherText, OnBottomMenuButtonClickListener<BottomMenu>)}
+     * 建议使用 {@link com.kongzue.dialogx.dialogs.BottomMenu#setOtherButton(CharSequence otherText, OnMenuButtonClickListener <BottomMenu>)}
      */
     @Deprecated
     public BottomMenu setOtherButton(CharSequence otherText, OnDialogButtonClickListener<BottomDialog> otherButtonClickListener) {
@@ -1178,7 +1175,7 @@ public class BottomMenu extends BottomDialog {
     }
 
     /**
-     * 建议使用 {@link com.kongzue.dialogx.dialogs.BottomMenu#setOtherButton(int otherTextResId, OnBottomMenuButtonClickListener<BottomMenu>)}
+     * 建议使用 {@link com.kongzue.dialogx.dialogs.BottomMenu#setOtherButton(int otherTextResId, OnMenuButtonClickListener <BottomMenu>)}
      */
     @Deprecated
     public BottomMenu setOtherButton(int otherTextResId, OnDialogButtonClickListener<BottomDialog> otherButtonClickListener) {

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

@@ -47,9 +47,12 @@ import com.kongzue.dialogx.interfaces.OnBackgroundMaskClickListener;
 import com.kongzue.dialogx.interfaces.OnBindView;
 import com.kongzue.dialogx.interfaces.OnDialogButtonClickListener;
 import com.kongzue.dialogx.interfaces.OnInputDialogButtonClickListener;
+import com.kongzue.dialogx.interfaces.OnMenuButtonClickListener;
+import com.kongzue.dialogx.interfaces.ScrollController;
 import com.kongzue.dialogx.style.MaterialStyle;
 import com.kongzue.dialogx.util.InputInfo;
 import com.kongzue.dialogx.util.TextInfo;
+import com.kongzue.dialogx.util.views.DialogScrollView;
 import com.kongzue.dialogx.util.views.DialogXBaseRelativeLayout;
 import com.kongzue.dialogx.util.views.MaxRelativeLayout;
 
@@ -283,7 +286,9 @@ public class MessageDialog extends BaseDialog {
         public DialogXBaseRelativeLayout boxRoot;
         public MaxRelativeLayout bkg;
         public TextView txtDialogTitle;
+        public ScrollController scrollView;
         public TextView txtDialogTip;
+        public ViewGroup boxList;
         public RelativeLayout boxCustom;
         public EditText txtInput;
         public LinearLayout boxButton;
@@ -299,7 +304,9 @@ public class MessageDialog extends BaseDialog {
             boxRoot = convertView.findViewById(R.id.box_root);
             bkg = convertView.findViewById(R.id.bkg);
             txtDialogTitle = convertView.findViewById(R.id.txt_dialog_title);
+            scrollView = convertView.findViewById(R.id.scrollView);
             txtDialogTip = convertView.findViewById(R.id.txt_dialog_tip);
+            boxList = convertView.findViewById(R.id.box_list);
             boxCustom = convertView.findViewById(R.id.box_custom);
             txtInput = convertView.findViewById(R.id.txt_input);
             boxButton = convertView.findViewById(R.id.box_button);
@@ -447,6 +454,10 @@ public class MessageDialog extends BaseDialog {
                             if (!((OnDialogButtonClickListener) okButtonClickListener).onClick(me, v)) {
                                 doDismiss(v);
                             }
+                        } else if (okButtonClickListener instanceof OnMenuButtonClickListener) {
+                            if (!((OnMenuButtonClickListener) okButtonClickListener).onClick(me, v)) {
+                                doDismiss(v);
+                            }
                         }
                     } else {
                         doDismiss(v);
@@ -467,6 +478,10 @@ public class MessageDialog extends BaseDialog {
                             if (!((OnInputDialogButtonClickListener) cancelButtonClickListener).onClick(me, v, s)) {
                                 doDismiss(v);
                             }
+                        } else if (cancelButtonClickListener instanceof OnMenuButtonClickListener) {
+                            if (!((OnMenuButtonClickListener) cancelButtonClickListener).onClick(me, v)) {
+                                doDismiss(v);
+                            }
                         } else {
                             if (!((OnDialogButtonClickListener) cancelButtonClickListener).onClick(me, v)) {
                                 doDismiss(v);
@@ -491,6 +506,10 @@ public class MessageDialog extends BaseDialog {
                             if (!((OnInputDialogButtonClickListener) otherButtonClickListener).onClick(me, v, s)) {
                                 doDismiss(v);
                             }
+                        } else if (otherButtonClickListener instanceof OnMenuButtonClickListener) {
+                            if (!((OnMenuButtonClickListener) otherButtonClickListener).onClick(me, v)) {
+                                doDismiss(v);
+                            }
                         } else {
                             if (!((OnDialogButtonClickListener) otherButtonClickListener).onClick(me, v)) {
                                 doDismiss(v);
@@ -810,6 +829,20 @@ public class MessageDialog extends BaseDialog {
             if (onBindView != null && onBindView.getCustomView() != null) {
                 onBindView.bindParent(boxCustom, me);
                 boxCustom.setVisibility(View.VISIBLE);
+                if (onBindView.getCustomView() instanceof ScrollController) {
+                    if (scrollView instanceof DialogScrollView) {
+                        ((DialogScrollView) scrollView).setVerticalScrollBarEnabled(false);
+                    }
+                    scrollView = (ScrollController) onBindView.getCustomView();
+                } else {
+                    View scrollController = onBindView.getCustomView().findViewWithTag("ScrollController");
+                    if (scrollController instanceof ScrollController) {
+                        if (scrollView instanceof DialogScrollView) {
+                            ((DialogScrollView) scrollView).setVerticalScrollBarEnabled(false);
+                        }
+                        scrollView = (ScrollController) scrollController;
+                    }
+                }
             } else {
                 boxCustom.setVisibility(View.GONE);
             }
@@ -817,7 +850,7 @@ public class MessageDialog extends BaseDialog {
         }
 
         public void doDismiss(View v) {
-            if (MessageDialog.this.preDismiss(MessageDialog.this)){
+            if (MessageDialog.this.preDismiss(MessageDialog.this)) {
                 return;
             }
             if (v != null) v.setEnabled(false);
@@ -1294,6 +1327,9 @@ public class MessageDialog extends BaseDialog {
         if (getDialogImpl().boxCustom != null) {
             getDialogImpl().boxCustom.removeAllViews();
         }
+        if (getDialogImpl().boxList != null) {
+            getDialogImpl().boxList.removeAllViews();
+        }
         int layoutId = style.layout(isLightTheme());
         layoutId = layoutId == 0 ? (isLightTheme() ? R.layout.layout_dialogx_material : R.layout.layout_dialogx_material_dark) : layoutId;
 
@@ -1520,7 +1556,7 @@ public class MessageDialog extends BaseDialog {
         return this;
     }
 
-    public MessageDialog appendMessage(CharSequence message){
+    public MessageDialog appendMessage(CharSequence message) {
         this.message = TextUtils.concat(this.message, message);
         refreshUI();
         return this;
@@ -1532,7 +1568,7 @@ public class MessageDialog extends BaseDialog {
             if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                 getDialogView().setTranslationZ(orderIndex);
             } else {
-                error("DialogX: " + dialogKey() + " 执行 .setThisOrderIndex("+orderIndex+") 失败:系统不支持此方法,SDK-API 版本必须大于 21(LOLLIPOP)");
+                error("DialogX: " + dialogKey() + " 执行 .setThisOrderIndex(" + orderIndex + ") 失败:系统不支持此方法,SDK-API 版本必须大于 21(LOLLIPOP)");
             }
         }
         return this;

+ 1546 - 0
DialogX/src/main/java/com/kongzue/dialogx/dialogs/MessageMenu.java

@@ -0,0 +1,1546 @@
+package com.kongzue.dialogx.dialogs;
+
+import static android.view.View.OVER_SCROLL_NEVER;
+
+import android.graphics.Bitmap;
+import android.graphics.drawable.BitmapDrawable;
+import android.graphics.drawable.Drawable;
+import android.os.Build;
+import android.text.TextUtils;
+import android.view.MotionEvent;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.AdapterView;
+import android.widget.BaseAdapter;
+
+import androidx.annotation.ColorInt;
+import androidx.annotation.ColorRes;
+
+import com.kongzue.dialogx.DialogX;
+import com.kongzue.dialogx.R;
+import com.kongzue.dialogx.interfaces.BottomMenuListViewTouchEvent;
+import com.kongzue.dialogx.interfaces.DialogLifecycleCallback;
+import com.kongzue.dialogx.interfaces.DialogXAnimInterface;
+import com.kongzue.dialogx.interfaces.DialogXRunnable;
+import com.kongzue.dialogx.interfaces.DialogXStyle;
+import com.kongzue.dialogx.interfaces.MenuItemLayoutRefreshCallback;
+import com.kongzue.dialogx.interfaces.MenuItemTextInfoInterceptor;
+import com.kongzue.dialogx.interfaces.OnBackPressedListener;
+import com.kongzue.dialogx.interfaces.OnBackgroundMaskClickListener;
+import com.kongzue.dialogx.interfaces.OnBindView;
+import com.kongzue.dialogx.interfaces.OnMenuButtonClickListener;
+import com.kongzue.dialogx.interfaces.OnDialogButtonClickListener;
+import com.kongzue.dialogx.interfaces.OnIconChangeCallBack;
+import com.kongzue.dialogx.interfaces.OnMenuItemClickListener;
+import com.kongzue.dialogx.interfaces.OnMenuItemSelectListener;
+import com.kongzue.dialogx.interfaces.SELECT_MODE;
+import com.kongzue.dialogx.util.BottomMenuArrayAdapter;
+import com.kongzue.dialogx.util.MessageMenuArrayAdapter;
+import com.kongzue.dialogx.util.TextInfo;
+import com.kongzue.dialogx.util.views.DialogListView;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class MessageMenu extends MessageDialog {
+
+    protected MessageMenu me = this;
+    protected boolean allowInterceptTouch = true;
+    protected int selectionIndex = -1;
+    protected SELECT_MODE selectMode = SELECT_MODE.NONE;
+    protected ArrayList<Integer> selectionItems;
+
+    protected boolean showSelectedBackgroundTips = false;
+    protected MenuItemLayoutRefreshCallback<MessageMenu> menuMenuItemLayoutRefreshCallback;
+    protected Map<Integer, Boolean> menuUsability = new HashMap<Integer, Boolean>();
+
+    protected OnMenuItemClickListener<MessageMenu> onMenuItemClickListener;
+
+    public static MessageMenu build() {
+        return new MessageMenu();
+    }
+
+    public static MessageMenu build(DialogXStyle style) {
+        return new MessageMenu().setStyle(style);
+    }
+
+    public static MessageMenu build(OnBindView<MessageDialog> onBindView) {
+        return new MessageMenu().setCustomView(onBindView);
+    }
+
+    protected MessageMenu() {
+        super();
+    }
+
+    protected OnIconChangeCallBack<MessageMenu> onIconChangeCallBack;
+    protected MenuItemTextInfoInterceptor<MessageMenu> menuItemTextInfoInterceptor;
+    protected DialogListView listView;
+    protected TextInfo menuTextInfo;
+    protected BaseAdapter menuListAdapter;
+    protected List<CharSequence> menuList;
+    protected List<Integer> iconResIds;
+    protected boolean autoTintIconInLightOrDarkMode = true;
+
+    public static MessageMenu show(List<CharSequence> menuList) {
+        MessageMenu messageMenu = new MessageMenu();
+        messageMenu.setMenuList(menuList);
+        messageMenu.show();
+        return messageMenu;
+    }
+
+    public static MessageMenu show(List<CharSequence> menuList, OnMenuItemClickListener<MessageMenu> onMenuItemClickListener) {
+        MessageMenu messageMenu = new MessageMenu();
+        messageMenu.setMenuList(menuList);
+        messageMenu.setOnMenuItemClickListener(onMenuItemClickListener);
+        messageMenu.show();
+        return messageMenu;
+    }
+
+    public static MessageMenu showStringList(List<String> menuList) {
+        MessageMenu messageMenu = new MessageMenu();
+        messageMenu.setMenuStringList(menuList);
+        messageMenu.show();
+        return messageMenu;
+    }
+
+    public static MessageMenu showStringList(List<String> menuList, OnMenuItemClickListener<MessageMenu> onMenuItemClickListener) {
+        MessageMenu messageMenu = new MessageMenu();
+        messageMenu.setMenuStringList(menuList);
+        messageMenu.setOnMenuItemClickListener(onMenuItemClickListener);
+        messageMenu.show();
+        return messageMenu;
+    }
+
+    public static MessageMenu show(String... menuList) {
+        MessageMenu messageMenu = new MessageMenu();
+        messageMenu.setMenuList(menuList);
+        messageMenu.show();
+        return messageMenu;
+    }
+
+    public static MessageMenu show(String[] menuList, OnMenuItemClickListener<MessageMenu> onMenuItemClickListener) {
+        MessageMenu messageMenu = new MessageMenu();
+        messageMenu.setMenuList(menuList);
+        messageMenu.setOnMenuItemClickListener(onMenuItemClickListener);
+        messageMenu.show();
+        return messageMenu;
+    }
+
+    public static MessageMenu show(CharSequence[] menuList) {
+        MessageMenu messageMenu = new MessageMenu();
+        messageMenu.setMenuList(menuList);
+        messageMenu.show();
+        return messageMenu;
+    }
+
+    public static MessageMenu show(CharSequence[] menuList, OnMenuItemClickListener<MessageMenu> onMenuItemClickListener) {
+        MessageMenu messageMenu = new MessageMenu();
+        messageMenu.setMenuList(menuList);
+        messageMenu.setOnMenuItemClickListener(onMenuItemClickListener);
+        messageMenu.show();
+        return messageMenu;
+    }
+
+    public static MessageMenu show(CharSequence title, CharSequence message, List<CharSequence> menuList) {
+        MessageMenu messageMenu = new MessageMenu();
+        messageMenu.title = title;
+        messageMenu.message = message;
+        messageMenu.setMenuList(menuList);
+        messageMenu.show();
+        return messageMenu;
+    }
+
+    public static MessageMenu show(CharSequence title, CharSequence message, List<CharSequence> menuList, OnMenuItemClickListener<MessageMenu> onMenuItemClickListener) {
+        MessageMenu messageMenu = new MessageMenu();
+        messageMenu.title = title;
+        messageMenu.message = message;
+        messageMenu.setMenuList(menuList);
+        messageMenu.setOnMenuItemClickListener(onMenuItemClickListener);
+        messageMenu.show();
+        return messageMenu;
+    }
+
+    public static MessageMenu show(CharSequence title, List<CharSequence> menuList) {
+        MessageMenu messageMenu = new MessageMenu();
+        messageMenu.title = title;
+        messageMenu.setMenuList(menuList);
+        messageMenu.show();
+        return messageMenu;
+    }
+
+    public static MessageMenu show(CharSequence title, List<CharSequence> menuList, OnMenuItemClickListener<MessageMenu> onMenuItemClickListener) {
+        MessageMenu messageMenu = new MessageMenu();
+        messageMenu.title = title;
+        messageMenu.setMenuList(menuList);
+        messageMenu.setOnMenuItemClickListener(onMenuItemClickListener);
+        messageMenu.show();
+        return messageMenu;
+    }
+
+    public static MessageMenu showStringList(CharSequence title, CharSequence message, List<String> menuList) {
+        MessageMenu messageMenu = new MessageMenu();
+        messageMenu.title = title;
+        messageMenu.message = message;
+        messageMenu.setMenuStringList(menuList);
+        messageMenu.show();
+        return messageMenu;
+    }
+
+    public static MessageMenu showStringList(CharSequence title, CharSequence message, List<String> menuList, OnMenuItemClickListener<MessageMenu> onMenuItemClickListener) {
+        MessageMenu messageMenu = new MessageMenu();
+        messageMenu.title = title;
+        messageMenu.message = message;
+        messageMenu.setMenuStringList(menuList);
+        messageMenu.setOnMenuItemClickListener(onMenuItemClickListener);
+        messageMenu.show();
+        return messageMenu;
+    }
+
+    public static MessageMenu show(CharSequence title, CharSequence message, String[] menuList) {
+        MessageMenu messageMenu = new MessageMenu();
+        messageMenu.title = title;
+        messageMenu.message = message;
+        messageMenu.setMenuList(menuList);
+        messageMenu.show();
+        return messageMenu;
+    }
+
+    public static MessageMenu show(CharSequence title, CharSequence message, String[] menuList, OnMenuItemClickListener<MessageMenu> onMenuItemClickListener) {
+        MessageMenu messageMenu = new MessageMenu();
+        messageMenu.title = title;
+        messageMenu.message = message;
+        messageMenu.setMenuList(menuList);
+        messageMenu.setOnMenuItemClickListener(onMenuItemClickListener);
+        messageMenu.show();
+        return messageMenu;
+    }
+
+    public static MessageMenu show(CharSequence title, CharSequence message, CharSequence[] menuList) {
+        MessageMenu messageMenu = new MessageMenu();
+        messageMenu.title = title;
+        messageMenu.message = message;
+        messageMenu.setMenuList(menuList);
+        messageMenu.show();
+        return messageMenu;
+    }
+
+    public static MessageMenu show(CharSequence title, CharSequence message, CharSequence[] menuList, OnMenuItemClickListener<MessageMenu> onMenuItemClickListener) {
+        MessageMenu messageMenu = new MessageMenu();
+        messageMenu.title = title;
+        messageMenu.message = message;
+        messageMenu.setMenuList(menuList);
+        messageMenu.setOnMenuItemClickListener(onMenuItemClickListener);
+        messageMenu.show();
+        return messageMenu;
+    }
+
+    public static MessageMenu show(String title, String message, List<CharSequence> menuList) {
+        MessageMenu messageMenu = new MessageMenu();
+        messageMenu.title = title;
+        messageMenu.message = message;
+        messageMenu.setMenuList(menuList);
+        messageMenu.show();
+        return messageMenu;
+    }
+
+    public static MessageMenu show(String title, String message, List<CharSequence> menuList, OnMenuItemClickListener<MessageMenu> onMenuItemClickListener) {
+        MessageMenu messageMenu = new MessageMenu();
+        messageMenu.title = title;
+        messageMenu.message = message;
+        messageMenu.setMenuList(menuList);
+        messageMenu.setOnMenuItemClickListener(onMenuItemClickListener);
+        messageMenu.show();
+        return messageMenu;
+    }
+
+    public static MessageMenu showStringList(String title, String message, List<String> menuList) {
+        MessageMenu messageMenu = new MessageMenu();
+        messageMenu.title = title;
+        messageMenu.message = message;
+        messageMenu.setMenuStringList(menuList);
+        messageMenu.show();
+        return messageMenu;
+    }
+
+    public static MessageMenu showStringList(String title, String message, List<String> menuList, OnMenuItemClickListener<MessageMenu> onMenuItemClickListener) {
+        MessageMenu messageMenu = new MessageMenu();
+        messageMenu.title = title;
+        messageMenu.message = message;
+        messageMenu.setMenuStringList(menuList);
+        messageMenu.setOnMenuItemClickListener(onMenuItemClickListener);
+        messageMenu.show();
+        return messageMenu;
+    }
+
+    public static MessageMenu show(String title, String message, String[] menuList) {
+        MessageMenu messageMenu = new MessageMenu();
+        messageMenu.title = title;
+        messageMenu.message = message;
+        messageMenu.setMenuList(menuList);
+        messageMenu.show();
+        return messageMenu;
+    }
+
+    public static MessageMenu show(String title, String message, String[] menuList, OnMenuItemClickListener<MessageMenu> onMenuItemClickListener) {
+        MessageMenu messageMenu = new MessageMenu();
+        messageMenu.title = title;
+        messageMenu.message = message;
+        messageMenu.setMenuList(menuList);
+        messageMenu.setOnMenuItemClickListener(onMenuItemClickListener);
+        messageMenu.show();
+        return messageMenu;
+    }
+
+    public static MessageMenu show(String title, String message, CharSequence[] menuList) {
+        MessageMenu messageMenu = new MessageMenu();
+        messageMenu.title = title;
+        messageMenu.message = message;
+        messageMenu.setMenuList(menuList);
+        messageMenu.show();
+        return messageMenu;
+    }
+
+    public static MessageMenu show(String title, String message, CharSequence[] menuList, OnMenuItemClickListener<MessageMenu> onMenuItemClickListener) {
+        MessageMenu messageMenu = new MessageMenu();
+        messageMenu.title = title;
+        messageMenu.message = message;
+        messageMenu.setMenuList(menuList);
+        messageMenu.setOnMenuItemClickListener(onMenuItemClickListener);
+        messageMenu.show();
+        return messageMenu;
+    }
+
+    public static MessageMenu show(int titleResId, int messageResId, List<CharSequence> menuList) {
+        MessageMenu messageMenu = new MessageMenu();
+        messageMenu.title = messageMenu.getString(titleResId);
+        messageMenu.message = messageMenu.getString(messageResId);
+        messageMenu.setMenuList(menuList);
+        messageMenu.show();
+        return messageMenu;
+    }
+
+    public static MessageMenu show(int titleResId, List<CharSequence> menuList) {
+        MessageMenu messageMenu = new MessageMenu();
+        messageMenu.title = messageMenu.getString(titleResId);
+        messageMenu.setMenuList(menuList);
+        messageMenu.show();
+        return messageMenu;
+    }
+
+    public static MessageMenu showStringList(int titleResId, int messageResId, List<String> menuList) {
+        MessageMenu messageMenu = new MessageMenu();
+        messageMenu.title = messageMenu.getString(titleResId);
+        messageMenu.message = messageMenu.getString(messageResId);
+        messageMenu.setMenuStringList(menuList);
+        messageMenu.show();
+        return messageMenu;
+    }
+
+    public static MessageMenu show(int titleResId, int messageResId, String[] menuList) {
+        MessageMenu messageMenu = new MessageMenu();
+        messageMenu.title = messageMenu.getString(titleResId);
+        messageMenu.message = messageMenu.getString(messageResId);
+        messageMenu.setMenuList(menuList);
+        messageMenu.show();
+        return messageMenu;
+    }
+
+    public static MessageMenu show(int titleResId, int messageResId, CharSequence[] menuList) {
+        MessageMenu messageMenu = new MessageMenu();
+        messageMenu.title = messageMenu.getString(titleResId);
+        messageMenu.message = messageMenu.getString(messageResId);
+        messageMenu.setMenuList(menuList);
+        messageMenu.show();
+        return messageMenu;
+    }
+
+    public static MessageMenu show(int titleResId, int messageResId, List<CharSequence> menuList, OnMenuItemClickListener<MessageMenu> onMenuItemClickListener) {
+        MessageMenu messageMenu = new MessageMenu();
+        messageMenu.title = messageMenu.getString(titleResId);
+        messageMenu.message = messageMenu.getString(messageResId);
+        messageMenu.setOnMenuItemClickListener(onMenuItemClickListener);
+        messageMenu.setMenuList(menuList);
+        messageMenu.show();
+        return messageMenu;
+    }
+
+    public static MessageMenu show(int titleResId, List<CharSequence> menuList, OnMenuItemClickListener<MessageMenu> onMenuItemClickListener) {
+        MessageMenu messageMenu = new MessageMenu();
+        messageMenu.title = messageMenu.getString(titleResId);
+        messageMenu.setOnMenuItemClickListener(onMenuItemClickListener);
+        messageMenu.setMenuList(menuList);
+        messageMenu.show();
+        return messageMenu;
+    }
+
+    public static MessageMenu showStringList(int titleResId, int messageResId, List<String> menuList, OnMenuItemClickListener<MessageMenu> onMenuItemClickListener) {
+        MessageMenu messageMenu = new MessageMenu();
+        messageMenu.title = messageMenu.getString(titleResId);
+        messageMenu.message = messageMenu.getString(messageResId);
+        messageMenu.setMenuStringList(menuList);
+        messageMenu.setOnMenuItemClickListener(onMenuItemClickListener);
+        messageMenu.show();
+        return messageMenu;
+    }
+
+    public static MessageMenu show(int titleResId, int messageResId, String[] menuList, OnMenuItemClickListener<MessageMenu> onMenuItemClickListener) {
+        MessageMenu messageMenu = new MessageMenu();
+        messageMenu.title = messageMenu.getString(titleResId);
+        messageMenu.message = messageMenu.getString(messageResId);
+        messageMenu.setMenuList(menuList);
+        messageMenu.setOnMenuItemClickListener(onMenuItemClickListener);
+        messageMenu.show();
+        return messageMenu;
+    }
+
+    public static MessageMenu show(int titleResId, int messageResId, CharSequence[] menuList, OnMenuItemClickListener<MessageMenu> onMenuItemClickListener) {
+        MessageMenu messageMenu = new MessageMenu();
+        messageMenu.title = messageMenu.getString(titleResId);
+        messageMenu.message = messageMenu.getString(messageResId);
+        messageMenu.setMenuList(menuList);
+        messageMenu.setOnMenuItemClickListener(onMenuItemClickListener);
+        messageMenu.show();
+        return messageMenu;
+    }
+
+    public static MessageMenu show(CharSequence title, CharSequence[] menuList) {
+        MessageMenu messageMenu = new MessageMenu();
+        messageMenu.title = title;
+        messageMenu.setMenuList(menuList);
+        messageMenu.show();
+        return messageMenu;
+    }
+
+    public static MessageMenu show(CharSequence title, String[] menuList) {
+        MessageMenu messageMenu = new MessageMenu();
+        messageMenu.title = title;
+        messageMenu.setMenuList(menuList);
+        messageMenu.show();
+        return messageMenu;
+    }
+
+    public static MessageMenu show(CharSequence title, CharSequence[] menuList, OnMenuItemClickListener<MessageMenu> onMenuItemClickListener) {
+        MessageMenu messageMenu = new MessageMenu();
+        messageMenu.title = title;
+        messageMenu.setMenuList(menuList);
+        messageMenu.setOnMenuItemClickListener(onMenuItemClickListener);
+        messageMenu.show();
+        return messageMenu;
+    }
+
+    public static MessageMenu show(CharSequence title, String[] menuList, OnMenuItemClickListener<MessageMenu> onMenuItemClickListener) {
+        MessageMenu messageMenu = new MessageMenu();
+        messageMenu.title = title;
+        messageMenu.setMenuList(menuList);
+        messageMenu.setOnMenuItemClickListener(onMenuItemClickListener);
+        messageMenu.show();
+        return messageMenu;
+    }
+
+    public static MessageMenu show(int titleResId, CharSequence[] menuList) {
+        MessageMenu messageMenu = new MessageMenu();
+        messageMenu.title = messageMenu.getString(titleResId);
+        messageMenu.setMenuList(menuList);
+        messageMenu.show();
+        return messageMenu;
+    }
+
+    public static MessageMenu show(int titleResId, String[] menuList) {
+        MessageMenu messageMenu = new MessageMenu();
+        messageMenu.title = messageMenu.getString(titleResId);
+        messageMenu.setMenuList(menuList);
+        messageMenu.show();
+        return messageMenu;
+    }
+
+    public static MessageMenu show(int titleResId, CharSequence[] menuList, OnMenuItemClickListener<MessageMenu> onMenuItemClickListener) {
+        MessageMenu messageMenu = new MessageMenu();
+        messageMenu.title = messageMenu.getString(titleResId);
+        messageMenu.setMenuList(menuList);
+        messageMenu.setOnMenuItemClickListener(onMenuItemClickListener);
+        messageMenu.show();
+        return messageMenu;
+    }
+
+    public static MessageMenu show(int titleResId, String[] menuList, OnMenuItemClickListener<MessageMenu> onMenuItemClickListener) {
+        MessageMenu messageMenu = new MessageMenu();
+        messageMenu.title = messageMenu.getString(titleResId);
+        messageMenu.setMenuList(menuList);
+        messageMenu.setOnMenuItemClickListener(onMenuItemClickListener);
+        messageMenu.show();
+        return messageMenu;
+    }
+
+
+    private float touchDownY;
+
+    public static final int ITEM_CLICK_DELAY = 100;
+    private long lastClickTime = 0;
+    private int[] resultArray;
+    private CharSequence[] selectTextArray;
+
+    @Override
+    protected void onDialogShow() {
+        if (getDialogImpl() != null) {
+            getDialogImpl().boxList.setVisibility(View.VISIBLE);
+
+            if (!isAllowInterceptTouch()) {
+                getDialogImpl().bkg.setMaxHeight(maxHeight);
+                if (maxHeight != 0) {
+                    dialogImpl.scrollView.lockScroll(true);
+                }
+            }
+
+            int dividerDrawableResId = 0;
+            int dividerHeight = 1;
+            if (style.overrideBottomDialogRes() != null) {
+                dividerDrawableResId = style.overrideBottomDialogRes().overrideMenuDividerDrawableRes(isLightTheme());
+                dividerHeight = style.overrideBottomDialogRes().overrideMenuDividerHeight(isLightTheme());
+            }
+            if (dividerDrawableResId == 0) {
+                dividerDrawableResId = isLightTheme() ? R.drawable.rect_dialogx_material_menu_split_divider : R.drawable.rect_dialogx_material_menu_split_divider_night;
+            }
+
+
+            if (!isLightTheme()) {
+                listView = new DialogListView(getDialogImpl(), getOwnActivity(), R.style.DialogXCompatThemeDark);
+            } else {
+                listView = new DialogListView(getDialogImpl(), getOwnActivity());
+            }
+            listView.setOverScrollMode(OVER_SCROLL_NEVER);
+            listView.setDivider(getResources().getDrawable(dividerDrawableResId));
+            listView.setDividerHeight(dividerHeight);
+
+            listView.setBottomMenuListViewTouchEvent(new BottomMenuListViewTouchEvent() {
+                @Override
+                public void down(MotionEvent event) {
+                    touchDownY = getDialogImpl().bkg.getY();
+                }
+            });
+
+            listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
+                @Override
+                public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
+                    if (!isMenuItemEnable(position)) {
+                        return;
+                    }
+                    haptic(view);
+                    long currentTime = System.currentTimeMillis();
+                    if (currentTime - lastClickTime > ITEM_CLICK_DELAY) {
+                        lastClickTime = currentTime;
+                        float deltaY = Math.abs(touchDownY - getDialogImpl().bkg.getY());
+                        if (deltaY > dip2px(15)) {
+                            return;
+                        }
+                        selectionIndex = position;
+                        switch (selectMode) {
+                            case NONE:
+                                if (onMenuItemClickListener != null) {
+                                    if (!onMenuItemClickListener.onClick(me, menuList.get(position), position)) {
+                                        dismiss();
+                                    }
+                                } else {
+                                    dismiss();
+                                }
+                                break;
+                            case SINGLE:
+                                if (onMenuItemClickListener instanceof OnMenuItemSelectListener) {
+                                    OnMenuItemSelectListener<MessageMenu> onMenuItemSelectListener = (OnMenuItemSelectListener<MessageMenu>) onMenuItemClickListener;
+                                    if (!onMenuItemSelectListener.onClick(me, menuList.get(position), position)) {
+                                        dismiss();
+                                    } else {
+                                        menuListAdapter.notifyDataSetInvalidated();
+                                        onMenuItemSelectListener.onOneItemSelect(me, menuList.get(position), position, true);
+                                    }
+                                } else {
+                                    if (onMenuItemClickListener != null) {
+                                        if (!onMenuItemClickListener.onClick(me, menuList.get(position), position)) {
+                                            dismiss();
+                                        }
+                                    } else {
+                                        dismiss();
+                                    }
+                                }
+                                break;
+                            case MULTIPLE:
+                                if (onMenuItemClickListener instanceof OnMenuItemSelectListener) {
+                                    OnMenuItemSelectListener<MessageMenu> onMenuItemSelectListener = (OnMenuItemSelectListener<MessageMenu>) onMenuItemClickListener;
+                                    if (!onMenuItemSelectListener.onClick(me, menuList.get(position), position)) {
+                                        dismiss();
+                                    } else {
+                                        if (selectionItems.contains(position)) {
+                                            selectionItems.remove(new Integer(position));
+                                        } else {
+                                            selectionItems.add(position);
+                                        }
+                                        menuListAdapter.notifyDataSetInvalidated();
+                                        resultArray = new int[selectionItems.size()];
+                                        selectTextArray = new CharSequence[selectionItems.size()];
+                                        for (int i = 0; i < selectionItems.size(); i++) {
+                                            resultArray[i] = selectionItems.get(i);
+                                            selectTextArray[i] = menuList.get(resultArray[i]);
+                                        }
+                                        onMenuItemSelectListener.onMultiItemSelect(me, selectTextArray, resultArray);
+                                    }
+                                } else {
+                                    if (onMenuItemClickListener != null) {
+                                        if (!onMenuItemClickListener.onClick(me, menuList.get(position), position)) {
+                                            dismiss();
+                                        }
+                                    } else {
+                                        dismiss();
+                                    }
+                                }
+                                break;
+                        }
+                    }
+                }
+            });
+            if (style.overrideBottomDialogRes() != null) {
+                if (style.overrideBottomDialogRes().overrideMenuItemLayout(true, 0, 0, false) != 0) {
+                    listView.setSelector(R.color.empty);
+                }
+            }
+
+            ViewGroup.LayoutParams listViewLp = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
+            getDialogImpl().boxList.addView(listView, listViewLp);
+
+            refreshUI();
+        }
+    }
+
+    @Override
+    public void refreshUI() {
+        if (getDialogImpl() == null) return;
+        if (listView != null) {
+            if (menuListAdapter == null) {
+                menuListAdapter = new MessageMenuArrayAdapter(me, getOwnActivity(), menuList);
+            }
+            if (listView.getAdapter() == null) {
+                listView.setAdapter(menuListAdapter);
+            } else {
+                if (listView.getAdapter() != menuListAdapter) {
+                    listView.setAdapter(menuListAdapter);
+                } else {
+                    menuListAdapter.notifyDataSetChanged();
+                }
+            }
+        }
+
+        // 部分主题下选中项默认按下效果
+        if (showSelectedBackgroundTips) {
+            listView.post(new Runnable() {
+                @Override
+                public void run() {
+                    if (menuListAdapter instanceof BottomMenuArrayAdapter && showSelectedBackgroundTips) {
+                        BottomMenuArrayAdapter bottomMenuArrayAdapter = ((BottomMenuArrayAdapter) menuListAdapter);
+
+                        View selectItemView = listView.getChildAt(getSelection());
+                        if (selectItemView != null) {
+                            selectItemView.post(new Runnable() {
+                                @Override
+                                public void run() {
+                                    selectItemView.setPressed(true);
+                                }
+                            });
+                        }
+                    }
+                }
+            });
+        }
+        super.refreshUI();
+    }
+
+    public void preRefreshUI() {
+        if (getDialogImpl() == null) return;
+        runOnMain(new Runnable() {
+            @Override
+            public void run() {
+                refreshUI();
+            }
+        });
+    }
+
+
+    @Override
+    public String dialogKey() {
+        return getClass().getSimpleName() + "(" + Integer.toHexString(hashCode()) + ")";
+    }
+
+    public List<CharSequence> getMenuList() {
+        return menuList;
+    }
+
+    public MessageMenu setMenuList(List<CharSequence> menuList) {
+        this.menuList = menuList;
+        this.menuListAdapter = null;
+        preRefreshUI();
+        return this;
+    }
+
+    private boolean isSameSize(int menuListSize) {
+        if (this.menuList == null || this.menuList.size() == 0) {
+            return true;
+        }
+        return this.menuList.size() == menuListSize;
+    }
+
+    public MessageMenu setMenuStringList(List<String> menuList) {
+        this.menuList = new ArrayList<>();
+        this.menuList.addAll(menuList);
+        this.menuListAdapter = null;
+        preRefreshUI();
+        return this;
+    }
+
+    public MessageMenu setMenuList(String[] menuList) {
+        this.menuList = new ArrayList<>();
+        this.menuList.addAll(Arrays.asList(menuList));
+        this.menuListAdapter = null;
+        preRefreshUI();
+        return this;
+    }
+
+    public MessageMenu setMenuList(CharSequence[] menuList) {
+        this.menuList = Arrays.asList(menuList);
+        this.menuListAdapter = null;
+        preRefreshUI();
+        return this;
+    }
+
+    public MessageMenu setMenus(CharSequence... menuList) {
+        this.menuList = Arrays.asList(menuList);
+        this.menuListAdapter = null;
+        preRefreshUI();
+        return this;
+    }
+
+    public MessageMenu setMenus(String... menuList) {
+        this.menuList = Arrays.asList(menuList);
+        this.menuListAdapter = null;
+        preRefreshUI();
+        return this;
+    }
+
+    public OnIconChangeCallBack<MessageMenu> getOnIconChangeCallBack() {
+        return onIconChangeCallBack;
+    }
+
+    public MessageMenu setOnIconChangeCallBack(OnIconChangeCallBack<MessageMenu> onIconChangeCallBack) {
+        this.onIconChangeCallBack = onIconChangeCallBack;
+        return this;
+    }
+
+    public OnBackPressedListener<MessageDialog> getOnBackPressedListener() {
+        return (OnBackPressedListener<MessageDialog>) onBackPressedListener;
+    }
+
+    public MessageMenu setOnBackPressedListener(OnBackPressedListener<MessageDialog> onBackPressedListener) {
+        this.onBackPressedListener = onBackPressedListener;
+        preRefreshUI();
+        return this;
+    }
+
+    public MessageMenu setDialogLifecycleCallback(DialogLifecycleCallback<MessageDialog> dialogLifecycleCallback) {
+        this.dialogLifecycleCallback = dialogLifecycleCallback;
+        if (isShow) dialogLifecycleCallback.onShow(me);
+        return this;
+    }
+
+    public MessageMenu setStyle(DialogXStyle style) {
+        this.style = style;
+        return this;
+    }
+
+    public MessageMenu setTheme(DialogX.THEME theme) {
+        this.theme = theme;
+        return this;
+    }
+
+    public boolean isCancelable() {
+        if (privateCancelable != null) {
+            return privateCancelable == BOOLEAN.TRUE;
+        }
+        if (overrideCancelable != null) {
+            return overrideCancelable == BOOLEAN.TRUE;
+        }
+        return cancelable;
+    }
+
+    public MessageMenu setCancelable(boolean cancelable) {
+        this.privateCancelable = cancelable ? BOOLEAN.TRUE : BOOLEAN.FALSE;
+        preRefreshUI();
+        return this;
+    }
+
+    public MessageDialog.DialogImpl getDialogImpl() {
+        return dialogImpl;
+    }
+
+    public CharSequence getTitle() {
+        return title;
+    }
+
+    public MessageMenu setTitle(CharSequence title) {
+        this.title = title;
+        preRefreshUI();
+        return this;
+    }
+
+    public MessageMenu setTitle(int titleResId) {
+        this.title = getString(titleResId);
+        preRefreshUI();
+        return this;
+    }
+
+    public CharSequence getMessage() {
+        return message;
+    }
+
+    public MessageMenu setMessage(CharSequence message) {
+        this.message = message;
+        preRefreshUI();
+        return this;
+    }
+
+    public MessageMenu setMessage(int messageResId) {
+        this.message = getString(messageResId);
+        preRefreshUI();
+        return this;
+    }
+
+    public CharSequence getCancelButton() {
+        return cancelText;
+    }
+
+    public MessageMenu setCancelButton(CharSequence cancelText) {
+        this.cancelText = cancelText;
+        preRefreshUI();
+        return this;
+    }
+
+    public MessageMenu setCancelButton(int cancelTextResId) {
+        this.cancelText = getString(cancelTextResId);
+        preRefreshUI();
+        return this;
+    }
+
+    public MessageMenu setCancelButton(OnMenuButtonClickListener<MessageMenu> cancelButtonClickListener) {
+        this.cancelButtonClickListener = cancelButtonClickListener;
+        return this;
+    }
+
+    public MessageMenu setCancelButton(CharSequence cancelText, OnMenuButtonClickListener<MessageMenu> cancelButtonClickListener) {
+        this.cancelText = cancelText;
+        this.cancelButtonClickListener = cancelButtonClickListener;
+        preRefreshUI();
+        return this;
+    }
+
+    public MessageMenu setCancelButton(int cancelTextResId, OnMenuButtonClickListener<MessageMenu> cancelButtonClickListener) {
+        this.cancelText = getString(cancelTextResId);
+        this.cancelButtonClickListener = cancelButtonClickListener;
+        preRefreshUI();
+        return this;
+    }
+
+    /**
+     * 建议使用 {@link com.kongzue.dialogx.dialogs.MessageMenu#setCancelButton(OnMenuButtonClickListener<MessageMenu>)}
+     */
+    @Deprecated
+    public MessageMenu setCancelButton(OnDialogButtonClickListener<MessageDialog> cancelButtonClickListener) {
+        this.cancelButtonClickListener = cancelButtonClickListener;
+        return this;
+    }
+
+    /**
+     * 建议使用 {@link com.kongzue.dialogx.dialogs.MessageMenu#setCancelButton(CharSequence cancelText, OnMenuButtonClickListener<MessageMenu>)}
+     */
+    @Deprecated
+    public MessageMenu setCancelButton(CharSequence cancelText, OnDialogButtonClickListener<MessageDialog> cancelButtonClickListener) {
+        this.cancelText = cancelText;
+        this.cancelButtonClickListener = cancelButtonClickListener;
+        preRefreshUI();
+        return this;
+    }
+
+    /**
+     * 建议使用 {@link com.kongzue.dialogx.dialogs.MessageMenu#setCancelButton(int cancelTextResId, OnMenuButtonClickListener<MessageMenu>)}
+     */
+    @Deprecated
+    public MessageMenu setCancelButton(int cancelTextResId, OnDialogButtonClickListener<MessageDialog> cancelButtonClickListener) {
+        this.cancelText = getString(cancelTextResId);
+        this.cancelButtonClickListener = cancelButtonClickListener;
+        preRefreshUI();
+        return this;
+    }
+
+    public MessageMenu setCustomView(OnBindView<MessageDialog> onBindView) {
+        this.onBindView = onBindView;
+        preRefreshUI();
+        return this;
+    }
+
+    public View getCustomView() {
+        if (onBindView == null) return null;
+        return onBindView.getCustomView();
+    }
+
+    public MessageMenu removeCustomView() {
+        this.onBindView.clean();
+        preRefreshUI();
+        return this;
+    }
+
+    public boolean isAllowInterceptTouch() {
+        if (style.overrideBottomDialogRes() == null) {
+            return false;
+        } else {
+            return allowInterceptTouch && style.overrideBottomDialogRes().touchSlide();
+        }
+    }
+
+    public MessageMenu setAllowInterceptTouch(boolean allowInterceptTouch) {
+        this.allowInterceptTouch = allowInterceptTouch;
+        preRefreshUI();
+        return this;
+    }
+
+    public float getMessageDialogMaxHeight() {
+        return maxHeight;
+    }
+
+    public MessageMenu setMessageDialogMaxHeight(float dialogMaxHeight) {
+        this.maxHeight = (int) dialogMaxHeight;
+        return this;
+    }
+
+    public OnMenuItemClickListener<MessageMenu> getOnMenuItemClickListener() {
+        return onMenuItemClickListener;
+    }
+
+    public MessageMenu setOnMenuItemClickListener(OnMenuItemClickListener<MessageMenu> onMenuItemClickListener) {
+        this.onMenuItemClickListener = onMenuItemClickListener;
+        return this;
+    }
+
+    public BaseAdapter getMenuListAdapter() {
+        return menuListAdapter;
+    }
+
+    public MessageMenu setMenuListAdapter(BaseAdapter menuListAdapter) {
+        this.menuListAdapter = menuListAdapter;
+        return this;
+    }
+
+    public OnMenuButtonClickListener<MessageMenu> getMessageMenuCancelButtonClickListener() {
+        return (OnMenuButtonClickListener<MessageMenu>) cancelButtonClickListener;
+    }
+
+    public MessageMenu setCancelButtonClickListener(OnMenuButtonClickListener<MessageMenu> cancelButtonClickListener) {
+        this.cancelButtonClickListener = cancelButtonClickListener;
+        return this;
+    }
+
+    public TextInfo getTitleTextInfo() {
+        return titleTextInfo;
+    }
+
+    public MessageMenu setTitleTextInfo(TextInfo titleTextInfo) {
+        this.titleTextInfo = titleTextInfo;
+        preRefreshUI();
+        return this;
+    }
+
+    public TextInfo getMessageTextInfo() {
+        return messageTextInfo;
+    }
+
+    public MessageMenu setMessageTextInfo(TextInfo messageTextInfo) {
+        this.messageTextInfo = messageTextInfo;
+        preRefreshUI();
+        return this;
+    }
+
+    public TextInfo getCancelTextInfo() {
+        return cancelTextInfo;
+    }
+
+    public MessageMenu setCancelTextInfo(TextInfo cancelTextInfo) {
+        this.cancelTextInfo = cancelTextInfo;
+        preRefreshUI();
+        return this;
+    }
+
+    public int getBackgroundColor() {
+        return backgroundColor;
+    }
+
+    public MessageMenu setBackgroundColor(@ColorInt int backgroundColor) {
+        this.backgroundColor = backgroundColor;
+        preRefreshUI();
+        return this;
+    }
+
+    public int getSelection() {
+        return selectionIndex;
+    }
+
+    public ArrayList<Integer> getSelectionList() {
+        return selectionItems;
+    }
+
+    public MessageMenu setSelection(int selectionIndex) {
+        this.selectMode = SELECT_MODE.SINGLE;
+        this.selectionIndex = selectionIndex;
+        this.selectionItems = null;
+        menuListAdapter = null;
+        preRefreshUI();
+        return this;
+    }
+
+    public MessageMenu setSingleSelection() {
+        this.selectMode = SELECT_MODE.SINGLE;
+        this.selectionIndex = -1;
+        this.selectionItems = null;
+        menuListAdapter = null;
+        preRefreshUI();
+        return this;
+    }
+
+    public MessageMenu setSelection(int[] selectionItems) {
+        this.selectMode = SELECT_MODE.MULTIPLE;
+        this.selectionIndex = -1;
+        this.selectionItems = new ArrayList<>();
+        if (selectionItems != null) {
+            for (int itemIndex : selectionItems) {
+                this.selectionItems.add(itemIndex);
+            }
+        }
+        menuListAdapter = null;
+        preRefreshUI();
+        return this;
+    }
+
+    public MessageMenu setMultiSelection() {
+        this.selectMode = SELECT_MODE.MULTIPLE;
+        this.selectionIndex = -1;
+        this.selectionItems = new ArrayList<>();
+        menuListAdapter = null;
+        preRefreshUI();
+        return this;
+    }
+
+    public MessageMenu setSelection(List<Integer> selectionItems) {
+        this.selectMode = SELECT_MODE.MULTIPLE;
+        this.selectionIndex = -1;
+        this.selectionItems = new ArrayList<>(selectionItems);
+        menuListAdapter = null;
+        preRefreshUI();
+        return this;
+    }
+
+    public MessageMenu setNoSelect() {
+        this.selectMode = SELECT_MODE.NONE;
+        this.selectionIndex = -1;
+        this.selectionItems = null;
+        menuListAdapter = null;
+        preRefreshUI();
+        return this;
+    }
+
+    public MessageMenu setBackgroundColorRes(@ColorRes int backgroundRes) {
+        this.backgroundColor = getColor(backgroundRes);
+        preRefreshUI();
+        return this;
+    }
+
+    public CharSequence getOkButton() {
+        return okText;
+    }
+
+    public MessageMenu setOkButton(CharSequence okText) {
+        this.okText = okText;
+        preRefreshUI();
+        return this;
+    }
+
+    public MessageMenu setOkButton(int OkTextResId) {
+        this.okText = getString(OkTextResId);
+        preRefreshUI();
+        return this;
+    }
+
+    public MessageMenu setOkButton(OnMenuButtonClickListener<MessageMenu> okButtonClickListener) {
+        this.okButtonClickListener = okButtonClickListener;
+        return this;
+    }
+
+    public MessageMenu setOkButton(CharSequence okText, OnMenuButtonClickListener<MessageMenu> okButtonClickListener) {
+        this.okText = okText;
+        this.okButtonClickListener = okButtonClickListener;
+        return this;
+    }
+
+    public MessageMenu setOkButton(int okTextResId, OnMenuButtonClickListener<MessageMenu> okButtonClickListener) {
+        this.okText = getString(okTextResId);
+        this.okButtonClickListener = okButtonClickListener;
+        return this;
+    }
+
+    public MessageMenu setHapticFeedbackEnabled(boolean isHapticFeedbackEnabled) {
+        this.isHapticFeedbackEnabled = isHapticFeedbackEnabled ? 1 : 0;
+        return this;
+    }
+
+    /**
+     * 建议使用 {@link com.kongzue.dialogx.dialogs.MessageMenu#setOkButton(OnMenuButtonClickListener<MessageMenu>)}
+     */
+    @Deprecated
+    public MessageMenu setOkButton(OnDialogButtonClickListener<MessageDialog> okButtonClickListener) {
+        this.okButtonClickListener = okButtonClickListener;
+        return this;
+    }
+
+    /**
+     * 建议使用 {@link com.kongzue.dialogx.dialogs.MessageMenu#setOkButton(CharSequence okText, OnMenuButtonClickListener<MessageMenu>)}
+     */
+    @Deprecated
+    public MessageMenu setOkButton(CharSequence okText, OnDialogButtonClickListener<MessageDialog> okButtonClickListener) {
+        this.okText = okText;
+        this.okButtonClickListener = okButtonClickListener;
+        return this;
+    }
+
+    /**
+     * 建议使用 {@link com.kongzue.dialogx.dialogs.MessageMenu#setOkButton(int okTextResId, OnMenuButtonClickListener<MessageMenu>)}
+     */
+    @Deprecated
+    public MessageMenu setOkButton(int okTextResId, OnDialogButtonClickListener<MessageDialog> okButtonClickListener) {
+        this.okText = getString(okTextResId);
+        this.okButtonClickListener = okButtonClickListener;
+        return this;
+    }
+
+    public CharSequence getOtherButton() {
+        return otherText;
+    }
+
+    public MessageMenu setOtherButton(CharSequence otherText) {
+        this.otherText = otherText;
+        preRefreshUI();
+        return this;
+    }
+
+    public MessageMenu setOtherButton(int OtherTextResId) {
+        this.otherText = getString(OtherTextResId);
+        preRefreshUI();
+        return this;
+    }
+
+    public MessageMenu setOtherButton(OnMenuButtonClickListener<MessageMenu> otherButtonClickListener) {
+        this.otherButtonClickListener = otherButtonClickListener;
+        return this;
+    }
+
+    public MessageMenu setOtherButton(CharSequence otherText, OnMenuButtonClickListener<MessageMenu> otherButtonClickListener) {
+        this.otherText = otherText;
+        this.otherButtonClickListener = otherButtonClickListener;
+        return this;
+    }
+
+    public MessageMenu setOtherButton(int otherTextResId, OnMenuButtonClickListener<MessageMenu> otherButtonClickListener) {
+        this.otherText = getString(otherTextResId);
+        this.otherButtonClickListener = otherButtonClickListener;
+        return this;
+    }
+
+    /**
+     * 建议使用 {@link com.kongzue.dialogx.dialogs.MessageMenu#setOtherButton(OnMenuButtonClickListener<MessageMenu>)}
+     */
+    @Deprecated
+    public MessageMenu setOtherButton(OnDialogButtonClickListener<MessageDialog> otherButtonClickListener) {
+        this.otherButtonClickListener = otherButtonClickListener;
+        return this;
+    }
+
+    /**
+     * 建议使用 {@link com.kongzue.dialogx.dialogs.MessageMenu#setOtherButton(CharSequence otherText, OnMenuButtonClickListener<MessageMenu>)}
+     */
+    @Deprecated
+    public MessageMenu setOtherButton(CharSequence otherText, OnDialogButtonClickListener<MessageDialog> otherButtonClickListener) {
+        this.otherText = otherText;
+        this.otherButtonClickListener = otherButtonClickListener;
+        return this;
+    }
+
+    /**
+     * 建议使用 {@link com.kongzue.dialogx.dialogs.MessageMenu#setOtherButton(int otherTextResId, OnMenuButtonClickListener<MessageMenu>)}
+     */
+    @Deprecated
+    public MessageMenu setOtherButton(int otherTextResId, OnDialogButtonClickListener<MessageDialog> otherButtonClickListener) {
+        this.otherText = getString(otherTextResId);
+        this.otherButtonClickListener = otherButtonClickListener;
+        return this;
+    }
+
+    public MessageMenu setMaskColor(@ColorInt int maskColor) {
+        this.maskColor = maskColor;
+        preRefreshUI();
+        return this;
+    }
+
+    public long getEnterAnimDuration() {
+        return enterAnimDuration;
+    }
+
+    public MessageMenu setEnterAnimDuration(long enterAnimDuration) {
+        this.enterAnimDuration = enterAnimDuration;
+        return this;
+    }
+
+    public long getExitAnimDuration() {
+        return exitAnimDuration;
+    }
+
+    public MessageMenu setExitAnimDuration(long exitAnimDuration) {
+        this.exitAnimDuration = exitAnimDuration;
+        return this;
+    }
+
+    public SELECT_MODE getSelectMode() {
+        return selectMode;
+    }
+
+    @Override
+    protected void shutdown() {
+        dismiss();
+    }
+
+    public MessageMenu setMaxWidth(int maxWidth) {
+        this.maxWidth = maxWidth;
+        refreshUI();
+        return this;
+    }
+
+    public MessageMenu setMaxHeight(int maxHeight) {
+        this.maxHeight = maxHeight;
+        refreshUI();
+        return this;
+    }
+
+    public MessageMenu setMinHeight(int minHeight) {
+        this.minHeight = minHeight;
+        refreshUI();
+        return this;
+    }
+
+    public MessageMenu setMinWidth(int minWidth) {
+        this.minWidth = minWidth;
+        refreshUI();
+        return this;
+    }
+
+    public MessageMenu setDialogImplMode(DialogX.IMPL_MODE dialogImplMode) {
+        this.dialogImplMode = dialogImplMode;
+        return this;
+    }
+
+    public TextInfo getMenuTextInfo() {
+        if (menuTextInfo == null) return DialogX.menuTextInfo;
+        return menuTextInfo;
+    }
+
+    public MessageMenu setMenuTextInfo(TextInfo menuTextInfo) {
+        this.menuTextInfo = menuTextInfo;
+        return this;
+    }
+
+    public MenuItemTextInfoInterceptor<MessageMenu> getMenuItemTextInfoInterceptor() {
+        return menuItemTextInfoInterceptor;
+    }
+
+    public MessageMenu setMenuItemTextInfoInterceptor(MenuItemTextInfoInterceptor<MessageMenu> menuItemTextInfoInterceptor) {
+        this.menuItemTextInfoInterceptor = menuItemTextInfoInterceptor;
+        return this;
+    }
+
+    public boolean isBkgInterceptTouch() {
+        return bkgInterceptTouch;
+    }
+
+    public MessageMenu setBkgInterceptTouch(boolean bkgInterceptTouch) {
+        this.bkgInterceptTouch = bkgInterceptTouch;
+        return this;
+    }
+
+    public OnBackgroundMaskClickListener<MessageDialog> getOnBackgroundMaskClickListener() {
+        return onBackgroundMaskClickListener;
+    }
+
+    public MessageMenu setOnBackgroundMaskClickListener(OnBackgroundMaskClickListener<MessageDialog> onBackgroundMaskClickListener) {
+        this.onBackgroundMaskClickListener = onBackgroundMaskClickListener;
+        return this;
+    }
+
+    public MessageMenu setRadius(float radiusPx) {
+        backgroundRadius = radiusPx;
+        refreshUI();
+        return this;
+    }
+
+    public float getRadius() {
+        return backgroundRadius;
+    }
+
+    public MessageMenu setTitleIcon(Bitmap titleIcon) {
+        this.titleIcon = new BitmapDrawable(getResources(), titleIcon);
+        refreshUI();
+        return this;
+    }
+
+    public MessageMenu setTitleIcon(int titleIconResId) {
+        this.titleIcon = getResources().getDrawable(titleIconResId);
+        refreshUI();
+        return this;
+    }
+
+    public MessageMenu setTitleIcon(Drawable titleIcon) {
+        this.titleIcon = titleIcon;
+        refreshUI();
+        return this;
+    }
+
+    public DialogXAnimInterface<MessageDialog> getDialogXAnimImpl() {
+        return dialogXAnimImpl;
+    }
+
+    public MessageMenu setDialogXAnimImpl(DialogXAnimInterface<MessageDialog> dialogXAnimImpl) {
+        this.dialogXAnimImpl = dialogXAnimImpl;
+        return this;
+    }
+
+    public MessageMenu setRootPadding(int padding) {
+        this.screenPaddings = new int[]{padding, padding, padding, padding};
+        refreshUI();
+        return this;
+    }
+
+    public MessageMenu setRootPadding(int paddingLeft, int paddingTop, int paddingRight, int paddingBottom) {
+        this.screenPaddings = new int[]{paddingLeft, paddingTop, paddingRight, paddingBottom};
+        refreshUI();
+        return this;
+    }
+
+    public boolean isShowSelectedBackgroundTips() {
+        return showSelectedBackgroundTips;
+    }
+
+    public MessageMenu setShowSelectedBackgroundTips(boolean showSelectedBackgroundTips) {
+        this.showSelectedBackgroundTips = showSelectedBackgroundTips;
+        refreshUI();
+        return this;
+    }
+
+    // 返回点击的菜单索引
+    public int getSelectionIndex() {
+        return selectionIndex;
+    }
+
+    // 返回多选时,选择的菜单索引集合
+    public int[] getSelectionIndexArray() {
+        return resultArray;
+    }
+
+    // 返回多选时,选择的菜单文本集合
+    public CharSequence[] getSelectTextArray() {
+        return selectTextArray;
+    }
+
+    public MenuItemLayoutRefreshCallback<MessageMenu> getMenuMenuItemLayoutRefreshCallback() {
+        return menuMenuItemLayoutRefreshCallback;
+    }
+
+    public MessageMenu setMenuMenuItemLayoutRefreshCallback(MenuItemLayoutRefreshCallback<MessageMenu> menuMenuItemLayoutRefreshCallback) {
+        this.menuMenuItemLayoutRefreshCallback = menuMenuItemLayoutRefreshCallback;
+        return this;
+    }
+
+    public TextInfo getOkTextInfo() {
+        return okTextInfo;
+    }
+
+    public MessageMenu setOkTextInfo(TextInfo okTextInfo) {
+        this.okTextInfo = okTextInfo;
+        return this;
+    }
+
+    public TextInfo getOtherTextInfo() {
+        return otherTextInfo;
+    }
+
+    public MessageMenu setOtherTextInfo(TextInfo otherTextInfo) {
+        this.otherTextInfo = otherTextInfo;
+        return this;
+    }
+
+    public MessageMenu setData(String key, Object obj) {
+        if (data == null) data = new HashMap<>();
+        data.put(key, obj);
+        return this;
+    }
+
+    public MessageMenu onShow(DialogXRunnable<MessageDialog> dialogXRunnable) {
+        onShowRunnable = dialogXRunnable;
+        if (isShow() && onShowRunnable != null) {
+            onShowRunnable.run(this);
+        }
+        return this;
+    }
+
+    public MessageMenu onDismiss(DialogXRunnable<MessageDialog> dialogXRunnable) {
+        onDismissRunnable = dialogXRunnable;
+        return this;
+    }
+
+    public MessageMenu setEnableImmersiveMode(boolean enableImmersiveMode) {
+        this.enableImmersiveMode = enableImmersiveMode;
+        refreshUI();
+        return this;
+    }
+
+    public List<Integer> getIconResIds() {
+        return iconResIds;
+    }
+
+    public int getIconResIds(int position) {
+        if (iconResIds != null && position >= 0 && position < iconResIds.size()) {
+            return iconResIds.get(position);
+        }
+        return 0;
+    }
+
+    public MessageMenu setIconResIds(List<Integer> iconResIds) {
+        this.iconResIds = iconResIds;
+        refreshUI();
+        return this;
+    }
+
+    public MessageMenu setIconResIds(int... resIds) {
+        if (iconResIds == null) {
+            iconResIds = new ArrayList<>();
+        }
+        for (int id : resIds) {
+            iconResIds.add(id);
+        }
+        refreshUI();
+        return this;
+    }
+
+    public boolean isAutoTintIconInLightOrDarkMode() {
+        return autoTintIconInLightOrDarkMode;
+    }
+
+    public MessageMenu setAutoTintIconInLightOrDarkMode(boolean autoTintIconInLightOrDarkMode) {
+        this.autoTintIconInLightOrDarkMode = autoTintIconInLightOrDarkMode;
+        refreshUI();
+        return this;
+    }
+
+    public MessageMenu appendMessage(CharSequence message) {
+        this.message = TextUtils.concat(this.message, message);
+        refreshUI();
+        return this;
+    }
+
+    public MessageMenu setThisOrderIndex(int orderIndex) {
+        this.thisOrderIndex = orderIndex;
+        if (getDialogView() != null) {
+            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
+                getDialogView().setTranslationZ(orderIndex);
+            } else {
+                error("DialogX: " + dialogKey() + " 执行 .setThisOrderIndex(" + orderIndex + ") 失败:系统不支持此方法,SDK-API 版本必须大于 21(LOLLIPOP)");
+            }
+        }
+        return this;
+    }
+
+    public MessageMenu bringToFront() {
+        setThisOrderIndex(getHighestOrderIndex());
+        return this;
+    }
+
+    public MessageMenu enableMenu(int... menuIndex) {
+        for (int i : menuIndex) {
+            menuUsability.put(i, true);
+        }
+        return this;
+    }
+
+    public MessageMenu enableMenu(CharSequence... menuText) {
+        if (menuList != null && !menuList.isEmpty()) {
+            for (CharSequence c : menuText) {
+                int index = menuList.indexOf(c);
+                menuUsability.put(index, true);
+            }
+        } else {
+            error("DialogX: " + dialogKey() + " .enableMenu(" + menuText + ")执行失败,请先初始化菜单项 menuList");
+        }
+        return this;
+    }
+
+    public MessageMenu enableMenu(String... menuText) {
+        if (menuList != null && !menuList.isEmpty()) {
+            for (String c : menuText) {
+                int index = menuList.indexOf(c);
+                menuUsability.put(index, true);
+            }
+        } else {
+            error("DialogX: " + dialogKey() + " .enableMenu(" + menuText + ")执行失败,请先初始化菜单项 menuList");
+        }
+        return this;
+    }
+
+    public MessageMenu disableMenu(int... menuIndex) {
+        for (int i : menuIndex) {
+            menuUsability.put(i, false);
+        }
+        return this;
+    }
+
+    public MessageMenu disableMenu(CharSequence... menuText) {
+        if (menuList != null && !menuList.isEmpty()) {
+            for (CharSequence c : menuText) {
+                int index = menuList.indexOf(c);
+                menuUsability.put(index, false);
+            }
+        } else {
+            error("DialogX: " + dialogKey() + " .disableMenu(" + menuText + ")执行失败,请先初始化菜单项 menuList");
+        }
+        return this;
+    }
+
+    public MessageMenu disableMenu(String... menuText) {
+        if (menuList != null && !menuList.isEmpty()) {
+            for (String c : menuText) {
+                int index = menuList.indexOf(c);
+                menuUsability.put(index, false);
+            }
+        } else {
+            error("DialogX: " + dialogKey() + " .disableMenu(" + menuText + ")执行失败,请先初始化菜单项 menuList");
+        }
+        return this;
+    }
+
+    public boolean isMenuItemEnable(int index) {
+        Boolean enabled = menuUsability.get(index);
+        if (enabled == null) {
+            return true;
+        }
+        return enabled;
+    }
+
+}

+ 1 - 1
DialogX/src/main/java/com/kongzue/dialogx/interfaces/OnBottomMenuButtonClickListener.java → DialogX/src/main/java/com/kongzue/dialogx/interfaces/OnMenuButtonClickListener.java

@@ -2,7 +2,7 @@ package com.kongzue.dialogx.interfaces;
 
 import android.view.View;
 
-public interface OnBottomMenuButtonClickListener <D extends BaseDialog> extends BaseOnDialogClickCallback{
+public interface OnMenuButtonClickListener<D extends BaseDialog> extends BaseOnDialogClickCallback{
 
     boolean onClick(D dialog, View v);
 }

+ 5 - 0
DialogX/src/main/java/com/kongzue/dialogx/interfaces/SELECT_MODE.java

@@ -0,0 +1,5 @@
+package com.kongzue.dialogx.interfaces;
+
+public enum SELECT_MODE {
+    NONE, SINGLE, MULTIPLE
+}

+ 5 - 4
DialogX/src/main/java/com/kongzue/dialogx/util/BottomMenuArrayAdapter.java

@@ -17,13 +17,14 @@ import android.widget.TextView;
 
 import com.kongzue.dialogx.R;
 import com.kongzue.dialogx.dialogs.BottomMenu;
+import com.kongzue.dialogx.interfaces.SELECT_MODE;
 
 import java.util.List;
 
 /**
  * @author: Kongzue
- * @github: https://github.com/kongzue/
- * @homepage: http://kongzue.com/
+ * @github: <a href="https://github.com/kongzue/">空祖Github</a>
+ * @homepage: <a href="http://kongzue.com/">主页</a>
  * @mail: myzcxhh@live.cn
  * @createTime: 2020/10/7 0:00
  */
@@ -100,7 +101,7 @@ public class BottomMenuArrayAdapter extends BaseAdapter {
         } else {
             convertView.setAlpha(1f);
         }
-        if (bottomMenu.getSelectMode() == BottomMenu.SELECT_MODE.SINGLE) {
+        if (bottomMenu.getSelectMode() == SELECT_MODE.SINGLE) {
             if (viewHolder.imgDialogxMenuSelection != null) {
                 if (bottomMenu.getSelection() == position) {
                     viewHolder.imgDialogxMenuSelection.setVisibility(View.VISIBLE);
@@ -118,7 +119,7 @@ public class BottomMenuArrayAdapter extends BaseAdapter {
                     }
                 }
             }
-        } else if (bottomMenu.getSelectMode() == BottomMenu.SELECT_MODE.MULTIPLE) {
+        } else if (bottomMenu.getSelectMode() == SELECT_MODE.MULTIPLE) {
             if (viewHolder.imgDialogxMenuSelection != null) {
                 if (bottomMenu.getSelectionList().contains(position)) {
                     viewHolder.imgDialogxMenuSelection.setVisibility(View.VISIBLE);

+ 255 - 0
DialogX/src/main/java/com/kongzue/dialogx/util/MessageMenuArrayAdapter.java

@@ -0,0 +1,255 @@
+package com.kongzue.dialogx.util;
+
+import static com.kongzue.dialogx.interfaces.BaseDialog.isNull;
+import static com.kongzue.dialogx.interfaces.BaseDialog.useTextInfo;
+
+import android.content.Context;
+import android.content.res.ColorStateList;
+import android.os.Build;
+import android.text.TextUtils;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.BaseAdapter;
+import android.widget.ImageView;
+import android.widget.Space;
+import android.widget.TextView;
+
+import com.kongzue.dialogx.R;
+import com.kongzue.dialogx.dialogs.MessageMenu;
+import com.kongzue.dialogx.interfaces.SELECT_MODE;
+
+import java.util.List;
+
+public class MessageMenuArrayAdapter extends BaseAdapter {
+    private MessageMenu messageMenu;
+    public List<CharSequence> objects;
+    public Context context;
+
+    public MessageMenuArrayAdapter(MessageMenu messageMenu, Context context, List<CharSequence> objects) {
+        this.objects = objects;
+        this.context = context;
+        this.messageMenu = messageMenu;
+    }
+
+    class ViewHolder {
+        ImageView imgDialogxMenuIcon;
+        ImageView imgDialogxMenuSelection;
+        TextView txtDialogxMenuText;
+        Space spaceDialogxRightPadding;
+    }
+
+    @Override
+    public int getCount() {
+        return objects.size();
+    }
+
+    @Override
+    public CharSequence getItem(int position) {
+        return objects.get(position);
+    }
+
+    @Override
+    public long getItemId(int position) {
+        return position;
+    }
+
+    TextInfo defaultMenuTextInfo;
+
+    @Override
+    public View getView(int position, View convertView, ViewGroup parent) {
+        MessageMenuArrayAdapter.ViewHolder viewHolder = null;
+        if (convertView == null) {
+            viewHolder = new MessageMenuArrayAdapter.ViewHolder();
+            LayoutInflater mInflater = LayoutInflater.from(context);
+
+            int resourceId = R.layout.item_dialogx_material_bottom_menu_normal_text;
+            if (messageMenu.getStyle().overrideBottomDialogRes() != null) {
+                resourceId = messageMenu.getStyle().overrideBottomDialogRes().overrideMenuItemLayout(messageMenu.isLightTheme(), position, getCount(), false);
+                if (resourceId == 0) {
+                    resourceId = R.layout.item_dialogx_material_bottom_menu_normal_text;
+                } else {
+                    if (!isNull(messageMenu.getTitle()) || !isNull(messageMenu.getMessage()) ||
+                            messageMenu.getCustomView() != null) {
+                        if (position == 0) {
+                            resourceId = messageMenu.getStyle().overrideBottomDialogRes().overrideMenuItemLayout(messageMenu.isLightTheme(), position, getCount(), true);
+                        }
+                    }
+                }
+            }
+            convertView = mInflater.inflate(resourceId, null);
+
+            viewHolder.imgDialogxMenuIcon = convertView.findViewById(R.id.img_dialogx_menu_icon);
+            viewHolder.imgDialogxMenuSelection = convertView.findViewById(R.id.img_dialogx_menu_selection);
+            viewHolder.txtDialogxMenuText = convertView.findViewById(R.id.txt_dialogx_menu_text);
+            viewHolder.spaceDialogxRightPadding = convertView.findViewById(R.id.space_dialogx_right_padding);
+
+            convertView.setTag(viewHolder);
+        } else {
+            viewHolder = (MessageMenuArrayAdapter.ViewHolder) convertView.getTag();
+        }
+        if (!messageMenu.isMenuItemEnable(position)) {
+            convertView.setAlpha(0.4f);
+        } else {
+            convertView.setAlpha(1f);
+        }
+        if (messageMenu.getSelectMode() == SELECT_MODE.SINGLE) {
+            if (viewHolder.imgDialogxMenuSelection != null) {
+                if (messageMenu.getSelection() == position) {
+                    viewHolder.imgDialogxMenuSelection.setVisibility(View.VISIBLE);
+                    int overrideSelectionImageResId = messageMenu.getStyle().overrideBottomDialogRes().overrideSelectionImage(messageMenu.isLightTheme(), true);
+                    if (overrideSelectionImageResId != 0) {
+                        viewHolder.imgDialogxMenuSelection.setImageResource(overrideSelectionImageResId);
+                    }
+                } else {
+                    int overrideSelectionImageResId = messageMenu.getStyle().overrideBottomDialogRes().overrideSelectionImage(messageMenu.isLightTheme(), false);
+                    if (overrideSelectionImageResId != 0) {
+                        viewHolder.imgDialogxMenuSelection.setVisibility(View.VISIBLE);
+                        viewHolder.imgDialogxMenuSelection.setImageResource(overrideSelectionImageResId);
+                    } else {
+                        viewHolder.imgDialogxMenuSelection.setVisibility(View.INVISIBLE);
+                    }
+                }
+            }
+        } else if (messageMenu.getSelectMode() == SELECT_MODE.MULTIPLE) {
+            if (viewHolder.imgDialogxMenuSelection != null) {
+                if (messageMenu.getSelectionList().contains(position)) {
+                    viewHolder.imgDialogxMenuSelection.setVisibility(View.VISIBLE);
+                    int overrideSelectionImageResId = messageMenu.getStyle().overrideBottomDialogRes().overrideMultiSelectionImage(messageMenu.isLightTheme(), true);
+                    if (overrideSelectionImageResId != 0) {
+                        viewHolder.imgDialogxMenuSelection.setImageResource(overrideSelectionImageResId);
+                    }
+                } else {
+                    int overrideSelectionImageResId = messageMenu.getStyle().overrideBottomDialogRes().overrideMultiSelectionImage(messageMenu.isLightTheme(), false);
+                    if (overrideSelectionImageResId != 0) {
+                        viewHolder.imgDialogxMenuSelection.setVisibility(View.VISIBLE);
+                        viewHolder.imgDialogxMenuSelection.setImageResource(overrideSelectionImageResId);
+                    } else {
+                        viewHolder.imgDialogxMenuSelection.setVisibility(View.INVISIBLE);
+                    }
+                }
+            }
+        } else {
+            viewHolder.imgDialogxMenuSelection.setVisibility(View.GONE);
+        }
+        int overrideSelectionBackgroundColorRes = 0;
+        if (messageMenu.getStyle().overrideBottomDialogRes() != null) {
+            overrideSelectionBackgroundColorRes = messageMenu.getStyle().overrideBottomDialogRes().overrideSelectionMenuBackgroundColor(messageMenu.isLightTheme());
+        }
+        if (messageMenu.getSelection() == position) {
+            //选中的背景变色
+            if (overrideSelectionBackgroundColorRes != 0) {
+                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
+                    convertView.setBackgroundTintList(ColorStateList.valueOf(context.getResources().getColor(overrideSelectionBackgroundColorRes)));
+                }
+            }
+        }
+        CharSequence text = objects.get(position);
+
+        int textColor = messageMenu.isLightTheme() ? R.color.black90 : R.color.white90;
+        if (messageMenu.getStyle().overrideBottomDialogRes() != null) {
+            if (messageMenu.getStyle().overrideBottomDialogRes().overrideMenuTextColor(messageMenu.isLightTheme()) != 0) {
+                textColor = messageMenu.getStyle().overrideBottomDialogRes().overrideMenuTextColor(messageMenu.isLightTheme());
+            }
+        }
+
+        if (null != text) {
+            if (defaultMenuTextInfo == null) {
+                defaultMenuTextInfo = new TextInfo()
+                        .setShowEllipsis(viewHolder.txtDialogxMenuText.getEllipsize() == TextUtils.TruncateAt.END)
+                        .setFontColor(viewHolder.txtDialogxMenuText.getTextColors().getDefaultColor())
+                        .setBold(viewHolder.txtDialogxMenuText.getPaint().isFakeBoldText())
+                        .setFontSize(px2dip(viewHolder.txtDialogxMenuText.getTextSize()))
+                        .setGravity(viewHolder.txtDialogxMenuText.getGravity())
+                        .setMaxLines(viewHolder.txtDialogxMenuText.getMaxLines());
+            }
+            viewHolder.txtDialogxMenuText.setText(text);
+            viewHolder.txtDialogxMenuText.setTextColor(context.getResources().getColor(textColor));
+            if (messageMenu.getMenuItemTextInfoInterceptor() != null) {
+                TextInfo textInfo = messageMenu.getMenuItemTextInfoInterceptor().menuItemTextInfo(messageMenu, position, text.toString());
+                if (textInfo != null) {
+                    useTextInfo(viewHolder.txtDialogxMenuText, textInfo);
+                } else {
+                    if (messageMenu.getMenuTextInfo() != null) {
+                        useTextInfo(viewHolder.txtDialogxMenuText, messageMenu.getMenuTextInfo());
+                    } else {
+                        useTextInfo(viewHolder.txtDialogxMenuText, defaultMenuTextInfo);
+                    }
+                }
+            } else {
+                if (messageMenu.getMenuTextInfo() != null) {
+                    useTextInfo(viewHolder.txtDialogxMenuText, messageMenu.getMenuTextInfo());
+                }
+            }
+            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
+                if (viewHolder.imgDialogxMenuSelection != null) {
+                    if (messageMenu.getStyle().overrideBottomDialogRes() != null && messageMenu.getStyle().overrideBottomDialogRes().selectionImageTint(messageMenu.isLightTheme())) {
+                        viewHolder.imgDialogxMenuSelection.setImageTintList(ColorStateList.valueOf(context.getResources().getColor(textColor)));
+                    } else {
+                        viewHolder.imgDialogxMenuSelection.setImageTintList(null);
+                    }
+                }
+            }
+
+            if (messageMenu.getOnIconChangeCallBack() != null) {
+                int resId = messageMenu.getOnIconChangeCallBack().getIcon(messageMenu, position, text.toString());
+                boolean autoTintIconInLightOrDarkMode = messageMenu.getOnIconChangeCallBack().isAutoTintIconInLightOrDarkMode() == null ? messageMenu.isAutoTintIconInLightOrDarkMode() : messageMenu.getOnIconChangeCallBack().isAutoTintIconInLightOrDarkMode();
+
+                if (resId != 0) {
+                    viewHolder.imgDialogxMenuIcon.setVisibility(View.VISIBLE);
+                    viewHolder.imgDialogxMenuIcon.setImageResource(resId);
+                    if (viewHolder.spaceDialogxRightPadding != null) {
+                        viewHolder.spaceDialogxRightPadding.setVisibility(View.VISIBLE);
+                    }
+                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
+                        if (autoTintIconInLightOrDarkMode) {
+                            viewHolder.imgDialogxMenuIcon.setImageTintList(ColorStateList.valueOf(context.getResources().getColor(textColor)));
+                        }
+                    }
+                } else {
+                    viewHolder.imgDialogxMenuIcon.setVisibility(View.GONE);
+                    if (viewHolder.spaceDialogxRightPadding != null) {
+                        viewHolder.spaceDialogxRightPadding.setVisibility(View.GONE);
+                    }
+                }
+            } else {
+                if (messageMenu.getIconResIds() != null) {
+                    int resId = messageMenu.getIconResIds(position);
+                    boolean autoTintIconInLightOrDarkMode = messageMenu.isAutoTintIconInLightOrDarkMode();
+
+                    if (resId != 0) {
+                        viewHolder.imgDialogxMenuIcon.setVisibility(View.VISIBLE);
+                        viewHolder.imgDialogxMenuIcon.setImageResource(resId);
+                        if (viewHolder.spaceDialogxRightPadding != null) {
+                            viewHolder.spaceDialogxRightPadding.setVisibility(View.VISIBLE);
+                        }
+                        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
+                            if (autoTintIconInLightOrDarkMode) {
+                                viewHolder.imgDialogxMenuIcon.setImageTintList(ColorStateList.valueOf(context.getResources().getColor(textColor)));
+                            }
+                        }
+                    } else {
+                        viewHolder.imgDialogxMenuIcon.setVisibility(View.GONE);
+                        if (viewHolder.spaceDialogxRightPadding != null) {
+                            viewHolder.spaceDialogxRightPadding.setVisibility(View.GONE);
+                        }
+                    }
+                } else {
+                    viewHolder.imgDialogxMenuIcon.setVisibility(View.GONE);
+                    if (viewHolder.spaceDialogxRightPadding != null) {
+                        viewHolder.spaceDialogxRightPadding.setVisibility(View.GONE);
+                    }
+                }
+            }
+        }
+        if (messageMenu.getMenuMenuItemLayoutRefreshCallback() != null) {
+            messageMenu.getMenuMenuItemLayoutRefreshCallback().getView(messageMenu, position, convertView, parent);
+        }
+        return convertView;
+    }
+
+    private int px2dip(float pxValue) {
+        final float scale = context.getResources().getDisplayMetrics().density;
+        return (int) (pxValue / scale + 0.5f);
+    }
+}

+ 9 - 9
DialogX/src/main/java/com/kongzue/dialogx/util/views/BottomDialogListView.java → DialogX/src/main/java/com/kongzue/dialogx/util/views/DialogListView.java

@@ -9,8 +9,8 @@ import android.widget.ListView;
 
 import androidx.appcompat.view.ContextThemeWrapper;
 
-import com.kongzue.dialogx.dialogs.BottomDialog;
 import com.kongzue.dialogx.interfaces.BottomMenuListViewTouchEvent;
+import com.kongzue.dialogx.interfaces.DialogConvertViewInterface;
 
 /**
  * @author: Kongzue
@@ -19,31 +19,31 @@ import com.kongzue.dialogx.interfaces.BottomMenuListViewTouchEvent;
  * @mail: myzcxhh@live.cn
  * @createTime: 2020/10/6 23:42
  */
-public class BottomDialogListView extends ListView {
+public class DialogListView extends ListView {
     
     private BottomMenuListViewTouchEvent bottomMenuListViewTouchEvent;
     
-    public BottomDialogListView(Context context) {
+    public DialogListView(Context context) {
         super(context);
     }
     
-    public BottomDialogListView(Context context, AttributeSet attrs) {
+    public DialogListView(Context context, AttributeSet attrs) {
         super(context, attrs);
     }
     
-    public BottomDialogListView(Context context, AttributeSet attrs, int defStyleAttr) {
+    public DialogListView(Context context, AttributeSet attrs, int defStyleAttr) {
         super(context, attrs, defStyleAttr);
     }
     
-    private BottomDialog.DialogImpl dialogImpl;
+    private DialogConvertViewInterface dialogImpl;
     
-    public BottomDialogListView(BottomDialog.DialogImpl dialog, Context context) {
+    public DialogListView(DialogConvertViewInterface dialog, Context context) {
         super(context);
         dialogImpl = dialog;
         setVerticalScrollBarEnabled(false);
     }
     
-    public BottomDialogListView(BottomDialog.DialogImpl dialog, Context context,int theme) {
+    public DialogListView(DialogConvertViewInterface dialog, Context context, int theme) {
         super(new ContextThemeWrapper(context,theme));
         dialogImpl = dialog;
         setVerticalScrollBarEnabled(false);
@@ -114,7 +114,7 @@ public class BottomDialogListView extends ListView {
         super.setAdapter(adapter);
     }
     
-    public BottomDialogListView setBottomMenuListViewTouchEvent(BottomMenuListViewTouchEvent bottomMenuListViewTouchEvent) {
+    public DialogListView setBottomMenuListViewTouchEvent(BottomMenuListViewTouchEvent bottomMenuListViewTouchEvent) {
         this.bottomMenuListViewTouchEvent = bottomMenuListViewTouchEvent;
         return this;
     }

+ 5 - 5
DialogX/src/main/java/com/kongzue/dialogx/util/views/BottomDialogScrollView.java → DialogX/src/main/java/com/kongzue/dialogx/util/views/DialogScrollView.java

@@ -14,21 +14,21 @@ import com.kongzue.dialogx.interfaces.ScrollController;
  * @mail: myzcxhh@live.cn
  * @createTime: 2020/11/17 15:29
  */
-public class BottomDialogScrollView extends ScrollView implements ScrollController {
+public class DialogScrollView extends ScrollView implements ScrollController {
     
-    public BottomDialogScrollView(Context context) {
+    public DialogScrollView(Context context) {
         super(context);
     }
     
-    public BottomDialogScrollView(Context context, AttributeSet attrs) {
+    public DialogScrollView(Context context, AttributeSet attrs) {
         super(context, attrs);
     }
     
-    public BottomDialogScrollView(Context context, AttributeSet attrs, int defStyleAttr) {
+    public DialogScrollView(Context context, AttributeSet attrs, int defStyleAttr) {
         super(context, attrs, defStyleAttr);
     }
     
-    public BottomDialogScrollView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+    public DialogScrollView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
         super(context, attrs, defStyleAttr, defStyleRes);
     }
     

+ 2 - 2
DialogX/src/main/res/layout/layout_dialogx_bottom_material.xml

@@ -49,7 +49,7 @@
                     android:textColor="@color/black"
                     android:textSize="21dp" />
 
-                <com.kongzue.dialogx.util.views.BottomDialogScrollView
+                <com.kongzue.dialogx.util.views.DialogScrollView
                     android:id="@+id/scrollView"
                     android:layout_width="match_parent"
                     android:layout_height="wrap_content"
@@ -87,7 +87,7 @@
 
                     </LinearLayout>
 
-                </com.kongzue.dialogx.util.views.BottomDialogScrollView>
+                </com.kongzue.dialogx.util.views.DialogScrollView>
 
                 <LinearLayout
                     android:layout_width="match_parent"

+ 2 - 2
DialogX/src/main/res/layout/layout_dialogx_bottom_material_dark.xml

@@ -49,7 +49,7 @@
                     android:textColor="@color/white"
                     android:textSize="21dp" />
 
-                <com.kongzue.dialogx.util.views.BottomDialogScrollView
+                <com.kongzue.dialogx.util.views.DialogScrollView
                     android:id="@+id/scrollView"
                     android:layout_width="match_parent"
                     android:layout_height="wrap_content"
@@ -87,7 +87,7 @@
 
                     </LinearLayout>
 
-                </com.kongzue.dialogx.util.views.BottomDialogScrollView>
+                </com.kongzue.dialogx.util.views.DialogScrollView>
 
                 <LinearLayout
                     android:id="@+id/box_button"

+ 9 - 2
DialogX/src/main/res/layout/layout_dialogx_material.xml

@@ -40,7 +40,8 @@
                     android:textColor="@color/black"
                     android:textSize="21dp" />
 
-                <ScrollView
+                <com.kongzue.dialogx.util.views.DialogScrollView
+                    android:id="@+id/scrollView"
                     android:layout_width="match_parent"
                     android:layout_height="wrap_content"
                     android:layout_weight="1"
@@ -68,6 +69,11 @@
                             android:layout_height="wrap_content"
                             android:visibility="gone" />
 
+                        <FrameLayout
+                            android:id="@+id/box_list"
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content" />
+
                         <EditText
                             android:id="@+id/txt_input"
                             android:layout_width="match_parent"
@@ -86,9 +92,10 @@
                             android:textSize="18dp"
                             android:theme="@style/DialogXCompatThemeLight" />
 
+
                     </LinearLayout>
 
-                </ScrollView>
+                </com.kongzue.dialogx.util.views.DialogScrollView>
 
                 <LinearLayout
                     android:id="@+id/box_button"

+ 8 - 2
DialogX/src/main/res/layout/layout_dialogx_material_dark.xml

@@ -40,7 +40,9 @@
                     android:textColor="@color/white"
                     android:textSize="21dp" />
 
-                <ScrollView
+
+                <com.kongzue.dialogx.util.views.DialogScrollView
+                    android:id="@+id/scrollView"
                     android:layout_width="match_parent"
                     android:layout_height="wrap_content"
                     android:layout_weight="1"
@@ -86,9 +88,13 @@
                             android:textSize="18dp"
                             android:theme="@style/DialogXCompatThemeDark" />
 
+                        <FrameLayout
+                            android:id="@+id/box_list"
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content" />
                     </LinearLayout>
 
-                </ScrollView>
+                </com.kongzue.dialogx.util.views.DialogScrollView>
 
                 <LinearLayout
                     android:id="@+id/box_button"

+ 2 - 2
DialogXIOSStyle/src/main/res/layout/layout_dialogx_bottom_ios.xml

@@ -55,7 +55,7 @@
                             android:textSize="12dp"
                             android:textStyle="bold" />
 
-                        <com.kongzue.dialogx.util.views.BottomDialogScrollView
+                        <com.kongzue.dialogx.util.views.DialogScrollView
                             android:id="@+id/scrollView"
                             android:layout_width="match_parent"
                             android:layout_height="wrap_content"
@@ -102,7 +102,7 @@
 
                             </LinearLayout>
 
-                        </com.kongzue.dialogx.util.views.BottomDialogScrollView>
+                        </com.kongzue.dialogx.util.views.DialogScrollView>
 
                     </com.kongzue.dialogx.style.views.BlurLinearLayout>
 

+ 2 - 2
DialogXIOSStyle/src/main/res/layout/layout_dialogx_bottom_ios_dark.xml

@@ -56,7 +56,7 @@
                             android:textSize="12dp"
                             android:textStyle="bold" />
 
-                        <com.kongzue.dialogx.util.views.BottomDialogScrollView
+                        <com.kongzue.dialogx.util.views.DialogScrollView
                             android:id="@+id/scrollView"
                             android:layout_width="match_parent"
                             android:layout_height="wrap_content"
@@ -103,7 +103,7 @@
 
                             </LinearLayout>
 
-                        </com.kongzue.dialogx.util.views.BottomDialogScrollView>
+                        </com.kongzue.dialogx.util.views.DialogScrollView>
 
                     </com.kongzue.dialogx.style.views.BlurLinearLayout>
 

+ 9 - 2
DialogXIOSStyle/src/main/res/layout/layout_dialogx_ios.xml

@@ -40,7 +40,9 @@
                     android:textColor="@color/black"
                     android:textSize="17dp" />
 
-                <ScrollView
+
+                <com.kongzue.dialogx.util.views.DialogScrollView
+                    android:id="@+id/scrollView"
                     android:layout_width="match_parent"
                     android:layout_height="wrap_content"
                     android:layout_weight="1"
@@ -72,6 +74,11 @@
                             android:layout_height="wrap_content"
                             android:visibility="gone" />
 
+                        <FrameLayout
+                            android:id="@+id/box_list"
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content" />
+
                         <EditText
                             android:id="@+id/txt_input"
                             android:layout_width="match_parent"
@@ -92,7 +99,7 @@
 
                     </LinearLayout>
 
-                </ScrollView>
+                </com.kongzue.dialogx.util.views.DialogScrollView>
 
                 <ImageView
                     android:id="@+id/split_horizontal"

+ 11 - 4
DialogXIOSStyle/src/main/res/layout/layout_dialogx_ios_dark.xml

@@ -23,9 +23,9 @@
             <com.kongzue.dialogx.style.views.BlurLinearLayout
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
-                app:dialogxDarkMode="true"
                 android:clickable="true"
-                android:orientation="vertical">
+                android:orientation="vertical"
+                app:dialogxDarkMode="true">
 
                 <TextView
                     android:id="@+id/txt_dialog_title"
@@ -41,7 +41,9 @@
                     android:textColor="@color/white"
                     android:textSize="17dp" />
 
-                <ScrollView
+
+                <com.kongzue.dialogx.util.views.DialogScrollView
+                    android:id="@+id/scrollView"
                     android:layout_width="match_parent"
                     android:layout_height="wrap_content"
                     android:layout_weight="1"
@@ -73,6 +75,11 @@
                             android:layout_height="wrap_content"
                             android:visibility="gone" />
 
+                        <FrameLayout
+                            android:id="@+id/box_list"
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content" />
+
                         <EditText
                             android:id="@+id/txt_input"
                             android:layout_width="match_parent"
@@ -93,7 +100,7 @@
 
                     </LinearLayout>
 
-                </ScrollView>
+                </com.kongzue.dialogx.util.views.DialogScrollView>
 
                 <ImageView
                     android:id="@+id/split_horizontal"

+ 2 - 2
DialogXKongzueStyle/src/main/res/layout/layout_dialogx_bottom_kongzue.xml

@@ -40,7 +40,7 @@
                     android:textColor="@color/black"
                     android:textSize="18dp" />
 
-                <com.kongzue.dialogx.util.views.BottomDialogScrollView
+                <com.kongzue.dialogx.util.views.DialogScrollView
                     android:id="@+id/scrollView"
                     android:layout_width="match_parent"
                     android:layout_height="wrap_content"
@@ -86,7 +86,7 @@
 
                     </LinearLayout>
 
-                </com.kongzue.dialogx.util.views.BottomDialogScrollView>
+                </com.kongzue.dialogx.util.views.DialogScrollView>
 
                 <LinearLayout
                     android:layout_width="match_parent"

+ 2 - 2
DialogXKongzueStyle/src/main/res/layout/layout_dialogx_bottom_kongzue_dark.xml

@@ -40,7 +40,7 @@
                     android:textColor="@color/white"
                     android:textSize="18dp" />
 
-                <com.kongzue.dialogx.util.views.BottomDialogScrollView
+                <com.kongzue.dialogx.util.views.DialogScrollView
                     android:id="@+id/scrollView"
                     android:layout_width="match_parent"
                     android:layout_height="wrap_content"
@@ -86,7 +86,7 @@
 
                     </LinearLayout>
 
-                </com.kongzue.dialogx.util.views.BottomDialogScrollView>
+                </com.kongzue.dialogx.util.views.DialogScrollView>
 
                 <LinearLayout
                     android:layout_width="match_parent"

+ 9 - 2
DialogXKongzueStyle/src/main/res/layout/layout_dialogx_kongzue.xml

@@ -39,7 +39,9 @@
                     android:textColor="@color/black"
                     android:textSize="20dp" />
 
-                <ScrollView
+
+                <com.kongzue.dialogx.util.views.DialogScrollView
+                    android:id="@+id/scrollView"
                     android:layout_width="match_parent"
                     android:layout_height="wrap_content"
                     android:layout_weight="1"
@@ -72,6 +74,11 @@
                             android:layout_height="wrap_content"
                             android:visibility="gone" />
 
+                        <FrameLayout
+                            android:id="@+id/box_list"
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content" />
+
                         <EditText
                             android:id="@+id/txt_input"
                             android:layout_width="match_parent"
@@ -97,7 +104,7 @@
 
                     </LinearLayout>
 
-                </ScrollView>
+                </com.kongzue.dialogx.util.views.DialogScrollView>
 
                 <LinearLayout
                     android:id="@+id/box_button"

+ 9 - 2
DialogXKongzueStyle/src/main/res/layout/layout_dialogx_kongzue_dark.xml

@@ -39,7 +39,9 @@
                     android:textColor="@color/white"
                     android:textSize="20dp" />
 
-                <ScrollView
+
+                <com.kongzue.dialogx.util.views.DialogScrollView
+                    android:id="@+id/scrollView"
                     android:layout_width="match_parent"
                     android:layout_height="wrap_content"
                     android:layout_weight="1"
@@ -72,6 +74,11 @@
                             android:layout_height="wrap_content"
                             android:visibility="gone" />
 
+                        <FrameLayout
+                            android:id="@+id/box_list"
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content" />
+
                         <EditText
                             android:id="@+id/txt_input"
                             android:layout_width="match_parent"
@@ -97,7 +104,7 @@
 
                     </LinearLayout>
 
-                </ScrollView>
+                </com.kongzue.dialogx.util.views.DialogScrollView>
 
                 <LinearLayout
                     android:id="@+id/box_button"

+ 2 - 2
DialogXMIUIStyle/src/main/res/layout/layout_dialogx_bottom_miui.xml

@@ -39,7 +39,7 @@
                     android:textColor="@color/black"
                     android:textSize="18dp" />
 
-                <com.kongzue.dialogx.util.views.BottomDialogScrollView
+                <com.kongzue.dialogx.util.views.DialogScrollView
                     android:id="@+id/scrollView"
                     android:layout_width="match_parent"
                     android:layout_height="wrap_content"
@@ -83,7 +83,7 @@
 
                     </LinearLayout>
 
-                </com.kongzue.dialogx.util.views.BottomDialogScrollView>
+                </com.kongzue.dialogx.util.views.DialogScrollView>
 
                 <LinearLayout
                     android:id="@+id/box_button"

+ 2 - 2
DialogXMIUIStyle/src/main/res/layout/layout_dialogx_bottom_miui_dark.xml

@@ -39,7 +39,7 @@
                     android:textColor="@color/dialogxMIUITextDark"
                     android:textSize="18dp" />
 
-                <com.kongzue.dialogx.util.views.BottomDialogScrollView
+                <com.kongzue.dialogx.util.views.DialogScrollView
                     android:id="@+id/scrollView"
                     android:layout_width="match_parent"
                     android:layout_height="wrap_content"
@@ -83,7 +83,7 @@
 
                     </LinearLayout>
 
-                </com.kongzue.dialogx.util.views.BottomDialogScrollView>
+                </com.kongzue.dialogx.util.views.DialogScrollView>
 
                 <LinearLayout
                     android:id="@+id/box_button"

+ 9 - 2
DialogXMIUIStyle/src/main/res/layout/layout_dialogx_miui.xml

@@ -37,7 +37,8 @@
                     android:textColor="@color/black"
                     android:textSize="18dp" />
 
-                <ScrollView
+                <com.kongzue.dialogx.util.views.DialogScrollView
+                    android:id="@+id/scrollView"
                     android:layout_width="match_parent"
                     android:layout_height="wrap_content"
                     android:layout_weight="1"
@@ -71,6 +72,12 @@
                             android:layout_height="wrap_content"
                             android:visibility="gone" />
 
+
+                        <FrameLayout
+                            android:id="@+id/box_list"
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content" />
+
                         <EditText
                             android:id="@+id/txt_input"
                             android:layout_width="match_parent"
@@ -93,7 +100,7 @@
 
                     </LinearLayout>
 
-                </ScrollView>
+                </com.kongzue.dialogx.util.views.DialogScrollView>
 
                 <LinearLayout
                     android:id="@+id/box_button"

+ 8 - 2
DialogXMIUIStyle/src/main/res/layout/layout_dialogx_miui_dark.xml

@@ -37,7 +37,8 @@
                     android:textColor="@color/dialogxMIUITextDark"
                     android:textSize="18dp" />
 
-                <ScrollView
+                <com.kongzue.dialogx.util.views.DialogScrollView
+                    android:id="@+id/scrollView"
                     android:layout_width="match_parent"
                     android:layout_height="wrap_content"
                     android:layout_weight="1"
@@ -71,6 +72,11 @@
                             android:layout_height="wrap_content"
                             android:visibility="gone" />
 
+                        <FrameLayout
+                            android:id="@+id/box_list"
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content" />
+
                         <EditText
                             android:id="@+id/txt_input"
                             android:layout_width="match_parent"
@@ -93,7 +99,7 @@
 
                     </LinearLayout>
 
-                </ScrollView>
+                </com.kongzue.dialogx.util.views.DialogScrollView>
 
                 <LinearLayout
                     android:id="@+id/box_button"

+ 2 - 2
DialogXMaterialYou/src/main/res/layout/layout_dialogx_bottom_material_you.xml

@@ -50,7 +50,7 @@
                     android:textColor="@color/black"
                     android:textSize="21dp" />
 
-                <com.kongzue.dialogx.util.views.BottomDialogScrollView
+                <com.kongzue.dialogx.util.views.DialogScrollView
                     android:id="@+id/scrollView"
                     android:layout_width="match_parent"
                     android:layout_height="wrap_content"
@@ -89,7 +89,7 @@
 
                     </LinearLayout>
 
-                </com.kongzue.dialogx.util.views.BottomDialogScrollView>
+                </com.kongzue.dialogx.util.views.DialogScrollView>
 
                 <LinearLayout
                     android:layout_width="match_parent"

+ 2 - 2
DialogXMaterialYou/src/main/res/layout/layout_dialogx_bottom_material_you_dark.xml

@@ -50,7 +50,7 @@
                     android:textColor="@color/white"
                     android:textSize="21dp" />
 
-                <com.kongzue.dialogx.util.views.BottomDialogScrollView
+                <com.kongzue.dialogx.util.views.DialogScrollView
                     android:id="@+id/scrollView"
                     android:layout_width="match_parent"
                     android:layout_height="wrap_content"
@@ -89,7 +89,7 @@
 
                     </LinearLayout>
 
-                </com.kongzue.dialogx.util.views.BottomDialogScrollView>
+                </com.kongzue.dialogx.util.views.DialogScrollView>
 
                 <LinearLayout
                     android:id="@+id/box_button"

+ 13 - 7
DialogXMaterialYou/src/main/res/layout/layout_dialogx_material_you.xml

@@ -4,8 +4,8 @@
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:background="@color/black20"
-    android:theme="@style/DialogXCompatThemeLight"
-    android:orientation="vertical">
+    android:orientation="vertical"
+    android:theme="@style/DialogXCompatThemeLight">
 
     <RelativeLayout
         android:layout_width="match_parent"
@@ -33,16 +33,17 @@
                     android:layout_height="wrap_content"
                     android:layout_gravity="center_horizontal"
                     android:gravity="center_vertical"
-                    android:textAppearance="?attr/textAppearanceHeadline2"
                     android:paddingStart="20dp"
                     android:paddingTop="18dp"
                     android:paddingEnd="20dp"
                     android:paddingBottom="15dp"
                     android:text="Title"
+                    android:textAppearance="?attr/textAppearanceHeadline2"
                     android:textColor="@color/black"
                     android:textSize="21dp" />
 
-                <ScrollView
+                <com.kongzue.dialogx.util.views.DialogScrollView
+                    android:id="@+id/scrollView"
                     android:layout_width="match_parent"
                     android:layout_height="wrap_content"
                     android:layout_weight="1"
@@ -70,6 +71,11 @@
                             android:layout_height="wrap_content"
                             android:visibility="gone" />
 
+                        <FrameLayout
+                            android:id="@+id/box_list"
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content" />
+
                         <com.google.android.material.textfield.TextInputLayout
                             android:layout_width="match_parent"
                             android:layout_height="wrap_content"
@@ -79,13 +85,13 @@
                                 android:id="@+id/txt_input"
                                 android:layout_width="match_parent"
                                 android:layout_height="wrap_content"
-                                android:padding="10dp"
+                                android:layout_gravity="center_horizontal"
                                 android:layout_marginStart="20dp"
                                 android:layout_marginTop="10dp"
                                 android:layout_marginEnd="20dp"
-                                android:layout_gravity="center_horizontal"
                                 android:inputType="text"
                                 android:maxLines="1"
+                                android:padding="10dp"
                                 android:scrollbars="vertical"
                                 android:textColor="@color/black90"
                                 android:textSize="18dp" />
@@ -94,7 +100,7 @@
 
                     </LinearLayout>
 
-                </ScrollView>
+                </com.kongzue.dialogx.util.views.DialogScrollView>
 
                 <LinearLayout
                     android:id="@+id/box_button"

+ 7 - 2
DialogXMaterialYou/src/main/res/layout/layout_dialogx_material_you_dark.xml

@@ -41,7 +41,8 @@
                     android:textColor="@color/white"
                     android:textSize="21dp" />
 
-                <ScrollView
+                <com.kongzue.dialogx.util.views.DialogScrollView
+                    android:id="@+id/scrollView"
                     android:layout_width="match_parent"
                     android:layout_height="wrap_content"
                     android:layout_weight="1"
@@ -69,6 +70,10 @@
                             android:layout_height="wrap_content"
                             android:visibility="gone" />
 
+                        <FrameLayout
+                            android:id="@+id/box_list"
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content" />
 
                         <com.google.android.material.textfield.TextInputLayout
                             android:layout_width="match_parent"
@@ -95,7 +100,7 @@
 
                     </LinearLayout>
 
-                </ScrollView>
+                </com.kongzue.dialogx.util.views.DialogScrollView>
 
                 <LinearLayout
                     android:id="@+id/box_button"

+ 65 - 5
app/src/main/java/com/kongzue/dialogxdemo/activity/MainActivity.java

@@ -20,7 +20,6 @@ import android.view.MotionEvent;
 import android.view.View;
 import android.view.ViewGroup;
 import android.view.WindowInsets;
-import android.view.WindowInsetsController;
 import android.view.WindowManager;
 import android.view.inputmethod.InputMethodManager;
 import android.webkit.WebSettings;
@@ -44,7 +43,6 @@ import com.google.android.material.button.MaterialButtonToggleGroup;
 import com.kongzue.baseframework.BaseActivity;
 import com.kongzue.baseframework.interfaces.DarkNavigationBarTheme;
 import com.kongzue.baseframework.interfaces.DarkStatusBarTheme;
-import com.kongzue.baseframework.interfaces.FullScreen;
 import com.kongzue.baseframework.interfaces.Layout;
 import com.kongzue.baseframework.interfaces.NavigationBarBackgroundColorRes;
 import com.kongzue.baseframework.util.CycleRunner;
@@ -57,6 +55,7 @@ import com.kongzue.dialogx.dialogs.FullScreenDialog;
 import com.kongzue.dialogx.dialogs.GuideDialog;
 import com.kongzue.dialogx.dialogs.InputDialog;
 import com.kongzue.dialogx.dialogs.MessageDialog;
+import com.kongzue.dialogx.dialogs.MessageMenu;
 import com.kongzue.dialogx.dialogs.PopMenu;
 import com.kongzue.dialogx.dialogs.PopNotification;
 import com.kongzue.dialogx.dialogs.PopTip;
@@ -71,7 +70,7 @@ import com.kongzue.dialogx.interfaces.MenuItemTextInfoInterceptor;
 import com.kongzue.dialogx.interfaces.OnBackPressedListener;
 import com.kongzue.dialogx.interfaces.OnBackgroundMaskClickListener;
 import com.kongzue.dialogx.interfaces.OnBindView;
-import com.kongzue.dialogx.interfaces.OnBottomMenuButtonClickListener;
+import com.kongzue.dialogx.interfaces.OnMenuButtonClickListener;
 import com.kongzue.dialogx.interfaces.OnDialogButtonClickListener;
 import com.kongzue.dialogx.interfaces.OnIconChangeCallBack;
 import com.kongzue.dialogx.interfaces.OnInputDialogButtonClickListener;
@@ -121,6 +120,8 @@ public class MainActivity extends BaseActivity {
     private MaterialButton btnMessageDialog;
     private MaterialButton btnSelectDialog;
     private MaterialButton btnInputDialog;
+    private MaterialButton btnSelectMessageMenu;
+    private MaterialButton btnMutiSelectMessageMenu;
     private MaterialButton btnWaitDialog;
     private MaterialButton btnWaitAndTipDialog;
     private MaterialButton btnTipSuccess;
@@ -183,6 +184,8 @@ public class MainActivity extends BaseActivity {
         btnMessageDialog = findViewById(R.id.btn_messageDialog);
         btnSelectDialog = findViewById(R.id.btn_selectDialog);
         btnInputDialog = findViewById(R.id.btn_inputDialog);
+        btnSelectMessageMenu = findViewById(R.id.btn_select_menu);
+        btnMutiSelectMessageMenu = findViewById(R.id.btn_multiSelect_menu);
         btnWaitDialog = findViewById(R.id.btn_waitDialog);
         btnWaitAndTipDialog = findViewById(R.id.btn_waitAndTipDialog);
         btnTipSuccess = findViewById(R.id.btn_tipSuccess);
@@ -544,6 +547,63 @@ public class MainActivity extends BaseActivity {
             }
         });
 
+        btnSelectMessageMenu.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View view) {
+                MessageMenu.show(singleSelectMenuText)
+                        .setShowSelectedBackgroundTips(rdoMiui.isChecked())
+                        .setMessage("这里是权限确认的文本说明,这是一个演示菜单")
+                        .setTitle("获得权限标题")
+                        .setOnMenuItemClickListener(new OnMenuItemSelectListener<MessageMenu>() {
+                            @Override
+                            public void onOneItemSelect(MessageMenu dialog, CharSequence text, int index, boolean select) {
+                                selectMenuIndex = index;
+                            }
+                        })
+                        .setCancelButton("确定", new OnMenuButtonClickListener<MessageMenu>() {
+                            @Override
+                            public boolean onClick(MessageMenu baseDialog, View v) {
+                                PopTip.show("已选择:" + singleSelectMenuText[selectMenuIndex]);
+                                return false;
+                            }
+                        })
+                        .setSelection(selectMenuIndex);
+            }
+        });
+        btnMutiSelectMessageMenu.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                MessageMenu.show(multiSelectMenuText)
+                        .setMessage("这里是选择城市的模拟范例,这是一个演示菜单")
+                        .setTitle("请选择城市")
+                        .setOnMenuItemClickListener(new OnMenuItemSelectListener<MessageMenu>() {
+                            @Override
+                            public void onMultiItemSelect(MessageMenu dialog, CharSequence[] text, int[] index) {
+                                multiSelectMenuResultCache = "";
+                                for (CharSequence c : text) {
+                                    multiSelectMenuResultCache = multiSelectMenuResultCache + " " + c;
+                                }
+                                selectMenuIndexArray = index;
+                            }
+                        })
+                        .setOkButton("确定", new OnMenuButtonClickListener<MessageMenu>() {
+                            @Override
+                            public boolean onClick(MessageMenu dialog, View v) {
+                                PopTip.show("已选择:" + multiSelectMenuResultCache);
+                                return false;
+                            }
+                        })
+//                        .setCancelButton("确定", new OnDialogButtonClickListener<MessageDialog>() {
+//                            @Override
+//                            public boolean onClick(MessageDialog baseDialog, View v) {
+//                                PopTip.show("已选择:" + multiSelectMenuResultCache);
+//                                return false;
+//                            }
+//                        })
+                        .setSelection(selectMenuIndexArray);
+            }
+        });
+
         btnWaitDialog.setOnClickListener(new View.OnClickListener() {
             @Override
             public void onClick(View v) {
@@ -1232,7 +1292,7 @@ public class MainActivity extends BaseActivity {
                                 selectMenuIndex = index;
                             }
                         })
-                        .setCancelButton("确定", new OnBottomMenuButtonClickListener<BottomMenu>() {
+                        .setCancelButton("确定", new OnMenuButtonClickListener<BottomMenu>() {
                             @Override
                             public boolean onClick(BottomMenu baseDialog, View v) {
                                 PopTip.show("已选择:" + singleSelectMenuText[selectMenuIndex]);
@@ -1259,7 +1319,7 @@ public class MainActivity extends BaseActivity {
                                 selectMenuIndexArray = index;
                             }
                         })
-                        .setOkButton("确定", new OnBottomMenuButtonClickListener<BottomMenu>() {
+                        .setOkButton("确定", new OnMenuButtonClickListener<BottomMenu>() {
                             @Override
                             public boolean onClick(BottomMenu dialog, View v) {
                                 PopTip.show("已选择:" + multiSelectMenuResultCache);

+ 3 - 2
app/src/main/java/com/kongzue/dialogxdemo/custom/recycleview/CustomRecycleView.java

@@ -11,6 +11,7 @@ import androidx.recyclerview.widget.LinearLayoutManager;
 import androidx.recyclerview.widget.RecyclerView;
 
 import com.kongzue.dialogx.interfaces.ScrollController;
+import com.kongzue.dialogx.util.views.DialogScrollView;
 
 /**
  * 自定义滑动布局范例。此处以 RecyclerView 为主要例子
@@ -63,7 +64,7 @@ public class CustomRecycleView extends RecyclerView implements ScrollController
     /**
      * 是否可以滑动判断依据,若当前滑动布局内容高度小于布局高度则为不可滑动。
      * 此处列举的是 RecycleView 的判断依据编写方法,
-     * ScrollView 的范例请参考 {@link com.kongzue.dialogx.util.views.BottomDialogScrollView#isCanScroll()}
+     * ScrollView 的范例请参考 {@link DialogScrollView#isCanScroll()}
      *
      * @return 是否可滑动
      */
@@ -75,7 +76,7 @@ public class CustomRecycleView extends RecyclerView implements ScrollController
     /**
      * 此处请给出已滑动距离值,BottomDialog 需要根据此值判断当子布局滑动过程中,父布局是否需要介入滑动流程。
      * 此处列举的是 RecycleView 的判断依据编写方法,
-     * ScrollView 的范例请参考 {@link com.kongzue.dialogx.util.views.BottomDialogScrollView#getScrollDistance()}
+     * ScrollView 的范例请参考 {@link DialogScrollView#getScrollDistance()}
      *
      * @return 已滑动距离
      */

+ 33 - 0
app/src/main/res/layout/activity_main.xml

@@ -314,6 +314,39 @@
                     app:cornerRadius="99dp"
                     app:icon="@mipmap/img_button_inputdialog" />
 
+                <com.google.android.material.button.MaterialButton
+                    android:id="@+id/btn_select_menu"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_margin="5dp"
+                    android:layout_marginTop="15dp"
+                    android:paddingLeft="15dp"
+                    android:paddingTop="10dp"
+                    android:paddingRight="15dp"
+                    android:paddingBottom="10dp"
+                    android:text="单选菜单对话框"
+                    android:textColor="@color/white"
+                    android:textSize="13dp"
+                    android:textStyle="bold"
+                    app:cornerRadius="99dp"
+                    app:icon="@mipmap/img_button_messagemenu" />
+
+                <com.google.android.material.button.MaterialButton
+                    android:id="@+id/btn_multiSelect_menu"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_margin="5dp"
+                    android:layout_marginTop="15dp"
+                    android:paddingLeft="15dp"
+                    android:paddingTop="10dp"
+                    android:paddingRight="15dp"
+                    android:paddingBottom="10dp"
+                    android:text="多选菜单对话框"
+                    android:textColor="@color/white"
+                    android:textSize="13dp"
+                    android:textStyle="bold"
+                    app:cornerRadius="99dp"
+                    app:icon="@mipmap/img_button_messagemenu" />
             </com.kongzue.stacklabelview.StackLayout>
 
             <TextView

BIN
app/src/main/res/mipmap-xxhdpi/img_button_messagemenu.png


+ 1 - 1
gradle.properties

@@ -19,7 +19,7 @@ android.useAndroidX=true
 # Automatically convert third-party libraries to use AndroidX
 android.enableJetifier=true
 
-BUILD_VERSION=0.0.50.beta13
+BUILD_VERSION=0.0.50.beta14
 BUILD_VERSION_INT=49
 DIALOGX_STYLE_VERSION=5
 android.nonTransitiveRClass=true

+ 1 - 1
gradle/wrapper/gradle-wrapper.properties

@@ -1,6 +1,6 @@
 #Thu Dec 22 18:17:29 CST 2022
 distributionBase=GRADLE_USER_HOME
-distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.3-bin.zip
+distributionUrl=https\://mirrors.cloud.tencent.com/gradle/gradle-7.3.3-bin.zip
 distributionPath=wrapper/dists
 zipStorePath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME