Android对话框组件。包括提示性对话框、确认对话框、输入对话框、菜单型对话框、单选、多选对话框、带进度条的对话框、loading对话框、以及自定义对话框等。

Material Dialog

遵循谷歌Material Design设计风格的对话框,api与系统同步,对不同尺寸的设备以及系统版本做了兼容。

  • 简单的提示性对话框

Dialog - 图1

1. new MaterialDialog.Builder(getContext())
2. .iconRes(R.drawable.icon_tip)
3. .title(R.string.tip_infos)
4. .content(R.string.content_simple_confirm_dialog)
5. .positiveText(R.string.lab_submit)
6. .show();

8. //使用DialogLoader可自由切换dialog显示的策略
9. DialogLoader.getInstance().showTipDialog(...);
  • 简单的确认对话框

Dialog - 图2

1. new MaterialDialog.Builder(getContext())
2. .content(R.string.tip_bluetooth_permission)
3. .positiveText(R.string.lab_yes)
4. .negativeText(R.string.lab_no)
5. .show();

7. //使用DialogLoader可自由切换dialog显示的策略
8. DialogLoader.getInstance().showConfirmDialog(...);
  • 简单带输入的对话框

Dialog - 图3

1. new MaterialDialog.Builder(getContext())
2. .iconRes(R.drawable.icon_warning)
3. .title(R.string.tip_warning)
4. .content(R.string.content_warning)
5. .inputType(
6. InputType.TYPE_CLASS_TEXT
7. | InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD
8. | InputType.TYPE_TEXT_FLAG_CAP_WORDS)
9. .input(
10. getString(R.string.hint_please_input_password),
11. "",
12. false,
13. ((dialog, input) -> Toast(input.toString())))
14. .inputRange(3, 5)
15. .positiveText(R.string.lab_continue)
16. .negativeText(R.string.lab_change)
17. .onPositive(((dialog, which) -> Toast("你输入了:" + dialog.getInputEditText().getText().toString())))
18. .cancelable(false)
19. .show();

21. //使用DialogLoader可自由切换dialog显示的策略
22. DialogLoader.getInstance().showInputDialog(...);
  • 菜单型对话框

Dialog - 图4

1. new MaterialDialog.Builder(getContext())
2. .title(R.string.tip_options)
3. .items(R.array.menu_values)
4. .itemsCallback((dialog, view, which, text) -> Toast(which + ": " + text))
5. .show();

7. //使用DialogLoader可自由切换dialog显示的策略
8. DialogLoader.getInstance().showContextMenuDialog(...);
  • 单选对话框

Dialog - 图5

1. new MaterialDialog.Builder(getContext())
2. .title(R.string.tip_capture_setting)
3. .items(R.array.lead_name_choice_entry)
4. .itemsCallbackSingleChoice(
5. 0,
6. (dialog, view, which, text) -> {
7. Toast(which + ": " + text);
8. return true; // allow selection
9. })
10. .positiveText(R.string.lab_choice)
11. .negativeText(R.string.lab_cancel)
12. .show();

14. //使用DialogLoader可自由切换dialog显示的策略
15. DialogLoader.getInstance().showSingleChoiceDialog(...);
  • 多选对话框

Dialog - 图6

1. new MaterialDialog.Builder(getContext())
2. .title(R.string.tip_capture_setting)
3. .items(R.array.lead_name_choice_entry)
4. .itemsCallbackMultiChoice(
5. new Integer[]{0, 1},
6. (dialog, which, text) -> {
7. StringBuilder sb = new StringBuilder("选中:\n");
8. for (int i = 0; i < which.length; i ++){
9. sb.append(which[i]).append(":").append(text[i]).append("\n");
10. }
11. Toast(sb.toString());
12. return true; // allow selection
13. })
14. .positiveText(R.string.lab_choice)
15. .negativeText(R.string.lab_cancel)
16. .show();
  • 水平有进度的进度条对话框

Dialog - 图7

1. new MaterialDialog.Builder(getContext())
2. .title(R.string.tip_update)
3. .content(R.string.content_downloading)
4. .contentGravity(GravityEnum.CENTER)
5. .progress(false, 150, true)
6. .cancelListener(
7. dialog -> {
8. if (thread != null) {
9. thread.interrupt();
10. }
11. })
12. .showListener(
13. dialogInterface -> {
14. updateProgress((MaterialDialog) dialogInterface);
15. })
16. .negativeText(R.string.lab_cancel)
17. .show();
  • 环形无进度的进度条对话框

Dialog - 图8

1. new MaterialDialog.Builder(getContext())
2. .iconRes(R.drawable.icon_sex_man)
3. .limitIconToDefaultSize()
4. .title(R.string.tip_patient_name)
5. .content(R.string.content_wait_for_receive_data)
6. .progress(true, 0)
7. .progressIndeterminateStyle(false)
8. .negativeText(R.string.lab_cancel)
9. .show();
  • 带图标条目的Dialog

Dialog - 图9

1. List<MaterialSimpleListItem> list = new ArrayList<>();
2. list.add(new MaterialSimpleListItem.Builder(getContext())
3. .content(R.string.lab_edit)
4. .icon(R.drawable.icon_edit)
5. .iconPaddingDp(8)
6. .build());
7. list.add(new MaterialSimpleListItem.Builder(getContext())
8. .content(R.string.lab_add)
9. .icon(R.drawable.icon_add)
10. .build());
11. list.add(new MaterialSimpleListItem.Builder(getContext())
12. .content(R.string.lab_delete)
13. .icon(R.drawable.icon_delete)
14. .build());
15. list.add(new MaterialSimpleListItem.Builder(getContext())
16. .content(R.string.lab_update)
17. .icon(R.drawable.icon_update)
18. .iconPaddingDp(8)
19. .build());
20. final MaterialSimpleListAdapter adapter = new MaterialSimpleListAdapter(list)
21. .setOnItemClickListener(new MaterialSimpleListAdapter.OnItemClickListener() {
22. @Override
23. public void onMaterialListItemSelected(MaterialDialog dialog, int index, MaterialSimpleListItem item) {
24. ToastUtils.toast(item.getContent().toString());
25. }
26. });
27. new MaterialDialog.Builder(getContext()).adapter(adapter, null).show();
  • 自定义对话框

Dialog - 图10

1. new MaterialDialog.Builder(getContext())
2. .customView(R.layout.dialog_custom, true)
3. .title("自定义对话框")
4. .positiveText(R.string.lab_submit)
5. .negativeText(R.string.lab_cancel)
6. .show();

8. //或者继承CustomMaterialDialog实现

常用方法

  • 设置标题:title(CharSequence title)
  • 设置标题的对齐方式: titleGravity(GravityEnum gravity)
  • 设置标题字体的颜色:titleColor(int color)
  • 设置对话框的图标:icon(Drawable icon)
  • 设置对话框的内容:content(CharSequence content)
  • 设置对话框内容的文字颜色:contentColor(int color)
  • 设置对话框内容的对齐方式:contentGravity(GravityEnum gravity)
  • 设置对话框列表内容的集合:items(Collection collection)
  • 设置对话框列表的点击回调:itemsCallback(ListCallback callback)
  • 设置对话框列表的长按点击回调:itemsLongCallback( ListLongCallback callback)
  • 设置对话框列表字体的颜色:itemsColor(int color)
  • 设置对话框列表单选监听:itemsCallbackSingleChoice(int selectedIndex, ListCallbackSingleChoice callback)
  • 设置对话框列表多选监听:itemsCallbackMultiChoice(Integer[] selectedIndices, ListCallbackMultiChoice callback)
  • 设置确定按钮的文字:positiveText(CharSequence message)
  • 设置确定按钮的点击回调:onPositive(SingleButtonCallback callback)
  • 设置确定按钮文字的颜色:positiveColor(int color)
  • 设置中性按钮的文字:neutralText(CharSequence message)
  • 设置中性按钮的点击回调:onNeutral(SingleButtonCallback callback)
  • 设置否定按钮的文字:negativeText(CharSequence message)
  • 设置否定按钮的点击回调:onNegative(SingleButtonCallback callback)
  • 设置对话框列表的点击效果 :listSelector(int selectorRes)
  • 设置按钮的点击效果 :btnSelector(int selectorRes)
  • 设置对话框自定义布局:customView(int layoutRes, boolean wrapInScrollView)
  • 设置对话框进度条:progress(boolean indeterminate, int max)
  • 设置对话框点击外部是否可消失:cancelable(boolean cancelable)
  • 设置对话框的显示监听:showListener(OnShowListener listener)
  • 设置对话框的消失监听:dismissListener(OnDismissListener listener)
  • 设置对话框的取消监听:cancelListener(OnCancelListener listener)
  • 设置对话框输入框的样式:input(
CharSequence hint,
 CharSequence prefill,
 boolean allowEmptyInput,
 InputCallback callback)

DialogLoader

对话框加载者,可自定义对话框的加载策略。框架默认提供了两套加载策略:AlertDialogStrategy 和 MaterialDialogStrategy。 默认使用的是MaterialDialogStrategy。

设置加载的策略

1. DialogLoader.getInstance().setIDialogStrategy(...);

策略方法

  • 显示简要的提示对话框:showTipDialog
  • 显示简要的确认对话框:showConfirmDialog
  • 显示带输入框的对话框:showInputDialog
  • 显示类似上下文菜单的对话框:showContextMenuDialog
  • 显示带单选项的对话框:showSingleChoiceDialog

BottomSheet

底部弹出对话框,支持List和Grid两种形式。

List形式

Dialog - 图11

1. new BottomSheet.BottomListSheetBuilder(getActivity())
2. .addItem("Item 1")
3. .addItem("Item 2")
4. .addItem("Item 3")
5. .setOnSheetItemClickListener(new BottomSheet.BottomListSheetBuilder.OnSheetItemClickListener() {
6. @Override
7. public void onClick(BottomSheet dialog, View itemView, int position, String tag) {
8. dialog.dismiss();
9. ToastUtils.toast("Item " + (position + 1));
10. }
11. })
12. .build()
13. .show();

Grid形式

Dialog - 图12

1. BottomSheet.BottomGridSheetBuilder builder = new BottomSheet.BottomGridSheetBuilder(getActivity());
2. builder
3. .addItem(R.drawable.icon_more_operation_share_friend, "分享到微信", TAG_SHARE_WECHAT_FRIEND, BottomSheet.BottomGridSheetBuilder.FIRST_LINE)
4. .addItem(R.drawable.icon_more_operation_share_moment, "分享到朋友圈", TAG_SHARE_WECHAT_MOMENT, BottomSheet.BottomGridSheetBuilder.FIRST_LINE)
5. .addItem(R.drawable.icon_more_operation_share_weibo, "分享到微博", TAG_SHARE_WEIBO, BottomSheet.BottomGridSheetBuilder.FIRST_LINE)
6. .addItem(R.drawable.icon_more_operation_share_chat, "分享到私信", TAG_SHARE_CHAT, BottomSheet.BottomGridSheetBuilder.FIRST_LINE)
7. .addItem(R.drawable.icon_more_operation_save, "保存到本地", TAG_SHARE_LOCAL, BottomSheet.BottomGridSheetBuilder.SECOND_LINE)
8. .setOnSheetItemClickListener(new BottomSheet.BottomGridSheetBuilder.OnSheetItemClickListener() {
9. @Override
10. public void onClick(BottomSheet dialog, BottomSheetItemView itemView) {
11. dialog.dismiss();
12. int tag = (int) itemView.getTag();
13. ToastUtils.toast("tag:" + tag + ", content:" + itemView.toString());
14. }
15. }).build().show();

LoadingDialog

自定义的loading对话框,支持更新提示信息,修改图标配置,旋转速度等。

  • 演示效果

Dialog - 图13

  • 使用案例
1. mLoadingDialog = WidgetUtils.getLoadingDialog(getContext())
2. .setIconScale(0.4F)
3. .setLoadingSpeed(8);

常用方法

  • 更新提示信息:updateMessage(String tipMessage)
  • 修改图标配置:setLoadingIcon(Drawable icon)
  • 资源回收:Recycle()
  • 设置loading旋转的速度:setLoadingSpeed(int speed)

MiniLoadingDialog

自定义的loading对话框,类似IOS的loading加载框,支持更新提示信息。

  • 演示效果

Dialog - 图14

  • 使用案例
1. mMiniLoadingDialog =  WidgetUtils.getMiniLoadingDialog(getContext());