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();
  7. //使用DialogLoader可自由切换dialog显示的策略
  8. 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();
  6. //使用DialogLoader可自由切换dialog显示的策略
  7. 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();
  20. //使用DialogLoader可自由切换dialog显示的策略
  21. 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();
  6. //使用DialogLoader可自由切换dialog显示的策略
  7. 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();
  13. //使用DialogLoader可自由切换dialog显示的策略
  14. 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();
  7. //或者继承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

对话框加载者,可自定义对话框的加载策略。框架默认提供了两套加载策略:AlertDialogStrategyMaterialDialogStrategy。 默认使用的是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());