public <D extends EasyDialog> D build() { EasyDialog dialog = createDialog(); AlertParams p = getParams(); Bundle bundle = new Bundle(); bundle.putSerializable(KEY_DIALOG_PARAMS, createDialogParamsByAlertParams(p)); bundle.putBoolean(KEY_IS_BOTTOM_DIALOG, isBottomDialog); bundle.putBoolean(KEY_IS_RETAIN_INSTANCE, isRetainInstance); dialog.setArguments(bundle); dialog.cancelListener = p.mOnCancelListener; dialog.dismissListener = p.mOnDismissListener; dialog.positiveListener = p.mPositiveButtonListener; dialog.neutralListener = p.mNeutralButtonListener; dialog.negativeListener = p.mNegativeButtonListener; dialog.clickListener = p.mOnClickListener; dialog.multiClickListener = p.mOnCheckboxClickListener; dialog.setCancelable(p.mCancelable); return (D) dialog; }
@Nullable private static <Dialog extends EasyDialog> EasyDialog getEasyDialog(Class<Dialog> clz) { if (clz == null) { return new EasyDialog(); } // 如果有class对象,那么则反射出一个实例 Dialog dialog = null; try { dialog = clz.newInstance(); } catch (java.lang.InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } return dialog; }
/** * 支持单选列表的对话框 */ public void singleChoiceDialog(View v) { EasyDialog dialog = EasyDialog.builder(this) .setTitle("Single Choice Dialog") .setSingleChoiceItems(new String[]{"Android", "ios", "wp"}, 1, (dialog1, position) -> { Log.d(TAG, "onItemClick pos = " + position); dialog1.dismiss(); })// 设置单选列表的数据和监听 .setPositiveButton("ok", null) .build(); dialog.setCancelable(false); dialog.show(getSupportFragmentManager(), TAG); }
getSupportFragmentManager().beginTransaction(); EasyDialog.Builder builder = EasyDialog.builder(this); builder.setTitle("Title") .setIcon(R.drawable.saber) ft.addToBackStack(null); EasyDialog.builder(MainActivity.this) .setTitle("Stack Dialog") .setMessage("Please press back button") .build() .show(ft, "stackDialog"); }) easyDialog.showAllowingStateLoss(getSupportFragmentManager());
public static Builder builder(@NonNull Context context) { return builder(context, 0); }
@Override protected Dialog createDialog(@NonNull FragmentActivity activity) { DialogParams p = getDialogParams(); // 得到来自父类的参数,这里将参数组装成builder对象 AlertDialog.Builder builder = new AlertDialog.Builder(activity, p.themeResId) .setTitle(p.title) .setIcon(p.mIconId) .setMessage(p.message) .setPositiveButton(p.positiveText, positiveListener) .setNeutralButton(p.neutralText, neutralListener) .setNegativeButton(p.negativeText, negativeListener); if (p.items != null) { if (p.isMultiChoice) { builder.setMultiChoiceItems(p.items, p.checkedItems, multiClickListener); } else if (p.isSingleChoice) { builder.setSingleChoiceItems(p.items, p.checkedItem, clickListener); } else { builder.setItems(p.items, clickListener); } } // 允许子类修改builder对象 modifyAlertDialogBuilder(builder); return builder.create(); }
@Override public void setupDialog(Dialog dialog, int style) { super.setupDialog(dialog, style); if (isBottomDialog()) { dialog.setContentView(getLayoutResId()); } }
@Override protected void bindAndSetViews(@Nullable View root) { super.bindAndSetViews(root); bindViews(root); setViews(); }
/** * 恢复参数 */ @CallSuper @Override protected void onRestoreInstanceState(@NonNull Bundle savedInstanceState) { EasyDialogListeners.restoreListenersIfActivity(this, getActivity()); }
@Override protected void modifyAlertDialogBuilder(android.support.v7.app.AlertDialog.Builder builder) { super.modifyAlertDialogBuilder(builder); if (getLayoutResId() != 0) { builder.setView(getLayoutResId()); } }
@NonNull @Override public Dialog onCreateDialog(Bundle savedInstanceState) { if (!isBottomDialog()) { return super.onCreateDialog(savedInstanceState); } else { return new BottomSheetDialog(getContext(), getTheme()); } }
/** * 从底部弹出的对话框 */ public void bottomDialog(View v) { BottomDialog.Builder builder = EasyDialog.builder(this, BottomDialog.class); builder.setMessage("click me"); builder.setIsBottomDialog(true); // 设置后则会变成从底部弹出,否则为正常模式 // 监听点空白处cancel的事件 builder.setOnCancelListener(d -> showToast("cancel")); builder.setOnDismissListener(d -> showToast("dismiss")); EasyDialog dialog = builder.build(); dialog.show(getSupportFragmentManager(), "dialog"); // 如果设置了,那么底部dialog就不支持手势关闭和空白处关闭 dialog.setCancelable(false); }
public static <Dialog extends EasyDialog> Builder builder(@NonNull Context context, final Class<Dialog> clz) { return builder(context, 0, clz); }
/** * 支持多选列表的对话框 */ public void multiChoiceDialog(View v) { EasyDialog.builder(this) // 设置数据和默认选中的选项 .setMultiChoiceItems( new String[]{"Android", "ios", "wp"}, new boolean[]{true, false, true}, (dialog, which, isChecked) -> showToast("onClick pos = " + which + " , isChecked = " + isChecked)) // 设置监听器 .build() .show(getSupportFragmentManager(), TAG); }
public static Builder builder(@NonNull Context context, @StyleRes int themeResId) { return builder(context, themeResId, null); }
@Override protected void setViews() { setLayout(); // setBackground(); // 可从getDialogParams()得到builder中的所有参数 titleTv.setText(getDialogParams().title); titleTv.setOnClickListener(v -> { FragmentTransaction ft = getFragmentManager().beginTransaction(); ft.remove(TopDialog.this); ft.addToBackStack(null); EasyDialog.builder(getContext()) .setTitle("第二个对话框") .setMessage("点击“返回”后会退回到之前的dialog") .build() .show(ft, "dialog"); }); }