From a17e807ff5593b7b39de2199545a71d06956dfda Mon Sep 17 00:00:00 2001 From: cgspine Date: Tue, 14 Nov 2017 22:01:46 +0800 Subject: [PATCH] bugfix: make content area of menu dialog scrollable when there are much items #54 #67 --- .../qmui/widget/dialog/QMUIDialog.java | 20 ++++++++- .../fragment/components/QDDialogFragment.java | 44 +++++++++++++++++-- 2 files changed, 59 insertions(+), 5 deletions(-) diff --git a/qmui/src/main/java/com/qmuiteam/qmui/widget/dialog/QMUIDialog.java b/qmui/src/main/java/com/qmuiteam/qmui/widget/dialog/QMUIDialog.java index 0a983fa9..330605eb 100644 --- a/qmui/src/main/java/com/qmuiteam/qmui/widget/dialog/QMUIDialog.java +++ b/qmui/src/main/java/com/qmuiteam/qmui/widget/dialog/QMUIDialog.java @@ -27,9 +27,9 @@ import android.widget.RelativeLayout; import android.widget.ScrollView; import android.widget.TextView; +import com.qmuiteam.qmui.R; import com.qmuiteam.qmui.util.QMUIDisplayHelper; import com.qmuiteam.qmui.util.QMUIResHelper; -import com.qmuiteam.qmui.R; import com.qmuiteam.qmui.util.QMUIViewHelper; import java.util.ArrayList; @@ -349,9 +349,11 @@ public class QMUIDialog extends Dialog { protected ArrayList mMenuItemViews; protected LinearLayout mMenuItemContainer; protected LinearLayout.LayoutParams mMenuItemLp; + private int mContentAreaMaxHeight; public MenuBaseDialogBuilder(Context context) { super(context); + mContentAreaMaxHeight = (int) (QMUIDisplayHelper.getScreenHeight(context) * 0.75); mMenuItemViews = new ArrayList<>(); mMenuItemLp = new LinearLayout.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, @@ -384,6 +386,11 @@ public class QMUIDialog extends Dialog { } + public T setContentAreaMaxHeight(int contentAreaMaxHeight) { + mContentAreaMaxHeight = contentAreaMaxHeight; + return (T) this; + } + @Override protected void onCreateContent(QMUIDialog dialog, ViewGroup parent) { mMenuItemContainer = new LinearLayout(mContext); @@ -409,7 +416,16 @@ public class QMUIDialog extends Dialog { for (QMUIDialogMenuItemView itemView : mMenuItemViews) { mMenuItemContainer.addView(itemView, mMenuItemLp); } - parent.addView(mMenuItemContainer); + ScrollView scrollView = new ScrollView(mContext) { + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + heightMeasureSpec = MeasureSpec.makeMeasureSpec(mContentAreaMaxHeight, + MeasureSpec.AT_MOST); + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + } + }; + scrollView.addView(mMenuItemContainer); + parent.addView(scrollView); } } diff --git a/qmuidemo/src/main/java/com/qmuiteam/qmuidemo/fragment/components/QDDialogFragment.java b/qmuidemo/src/main/java/com/qmuiteam/qmuidemo/fragment/components/QDDialogFragment.java index ce423cc1..d965fd37 100644 --- a/qmuidemo/src/main/java/com/qmuiteam/qmuidemo/fragment/components/QDDialogFragment.java +++ b/qmuidemo/src/main/java/com/qmuiteam/qmuidemo/fragment/components/QDDialogFragment.java @@ -24,10 +24,10 @@ import com.qmuiteam.qmui.widget.QMUITopBar; import com.qmuiteam.qmui.widget.dialog.QMUIDialog; import com.qmuiteam.qmui.widget.dialog.QMUIDialogAction; import com.qmuiteam.qmuidemo.QDDataManager; -import com.qmuiteam.qmuidemo.model.QDItemDescription; import com.qmuiteam.qmuidemo.R; import com.qmuiteam.qmuidemo.base.BaseFragment; import com.qmuiteam.qmuidemo.lib.annotation.Widget; +import com.qmuiteam.qmuidemo.model.QDItemDescription; import java.util.ArrayList; import java.util.Collections; @@ -78,6 +78,7 @@ public class QDDialogFragment extends BaseFragment { "带 Checkbox 的消息确认框", "单选菜单类型对话框", "多选菜单类型对话框", + "多选菜单类型对话框(item 数量很多)", "带输入框的对话框", "高度适应键盘升降的对话框" }; @@ -109,9 +110,12 @@ public class QDDialogFragment extends BaseFragment { showMultiChoiceDialog(); break; case 6: - showEditTextDialog(); + showNumerousMultiChoiceDialog(); break; case 7: + showEditTextDialog(); + break; + case 8: showAutoDialog(); break; } @@ -237,6 +241,40 @@ public class QDDialogFragment extends BaseFragment { builder.show(); } + private void showNumerousMultiChoiceDialog() { + final String[] items = new String[]{ + "选项1", "选项2", "选项3", "选项4", "选项5", "选项6", + "选项7", "选项8", "选项9", "选项10", "选项11", "选项12", + "选项13", "选项14", "选项15", "选项16", "选项17", "选项18" + }; + final QMUIDialog.MultiCheckableDialogBuilder builder = new QMUIDialog.MultiCheckableDialogBuilder(getActivity()) + .setCheckedItems(new int[]{1, 3}) + .addItems(items, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + + } + }); + builder.addAction("取消", new QMUIDialogAction.ActionListener() { + @Override + public void onClick(QMUIDialog dialog, int index) { + dialog.dismiss(); + } + }); + builder.addAction("提交", new QMUIDialogAction.ActionListener() { + @Override + public void onClick(QMUIDialog dialog, int index) { + String result = "你选择了 "; + for (int i = 0; i < builder.getCheckedItemIndexes().length; i++) { + result += "" + builder.getCheckedItemIndexes()[i] + "; "; + } + Toast.makeText(getActivity(), result, Toast.LENGTH_SHORT).show(); + dialog.dismiss(); + } + }); + builder.show(); + } + private void showEditTextDialog() { final QMUIDialog.EditTextDialogBuilder builder = new QMUIDialog.EditTextDialogBuilder(getActivity()); builder.setTitle("标题") @@ -256,7 +294,7 @@ public class QDDialogFragment extends BaseFragment { Toast.makeText(getActivity(), "您的昵称: " + text, Toast.LENGTH_SHORT).show(); dialog.dismiss(); } else { - Toast.makeText(getActivity(), "请填入昵称" , Toast.LENGTH_SHORT).show(); + Toast.makeText(getActivity(), "请填入昵称", Toast.LENGTH_SHORT).show(); } } })