f94892ee6bcf5a3e58306e65cbb4619c758e1325.svn-base 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. package com.hjq.base;
  2. import android.app.Dialog;
  3. import android.os.Bundle;
  4. import android.os.SystemClock;
  5. import android.support.annotation.NonNull;
  6. import android.support.annotation.Nullable;
  7. import android.support.v4.app.DialogFragment;
  8. import android.support.v4.app.Fragment;
  9. import android.support.v4.app.FragmentActivity;
  10. import android.support.v4.app.FragmentManager;
  11. import android.support.v4.app.FragmentTransaction;
  12. /**
  13. * desc : DialogFragment 基类
  14. */
  15. public class BaseDialogFragment extends DialogFragment {
  16. private BaseDialog mDialog;
  17. private static String sShowTag;
  18. private static long sLastTime;
  19. /**
  20. * 父类同名方法简化
  21. */
  22. public void show(Fragment fragment) {
  23. show(fragment.getFragmentManager(), fragment.getClass().getName());
  24. }
  25. /**
  26. * 父类同名方法简化
  27. */
  28. public void show(FragmentActivity activity) {
  29. show(activity.getSupportFragmentManager(), activity.getClass().getName());
  30. }
  31. @Override
  32. public void show(FragmentManager manager, String tag) {
  33. if (!isRepeatedShow(tag)) {
  34. super.show(manager, tag);
  35. }
  36. }
  37. @Override
  38. public int show(FragmentTransaction transaction, String tag) {
  39. if (!isRepeatedShow(tag)) {
  40. return super.show(transaction, tag);
  41. }
  42. return -1;
  43. }
  44. /**
  45. * 根据 tag 判断这个 Dialog 是否重复显示了
  46. *
  47. * @param tag Tag标记
  48. */
  49. protected boolean isRepeatedShow(String tag) {
  50. boolean result = tag.equals(sShowTag) && SystemClock.uptimeMillis() - sLastTime < 500;
  51. sShowTag = tag;
  52. sLastTime = SystemClock.uptimeMillis();
  53. return result;
  54. }
  55. @NonNull
  56. @Override
  57. public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
  58. if (mDialog != null) {
  59. return mDialog;
  60. }else {
  61. // 不使用 Dialog,替换成 BaseDialog 对象
  62. return mDialog = new BaseDialog(getActivity());
  63. }
  64. }
  65. public void setDialog(BaseDialog dialog) {
  66. mDialog = dialog;
  67. }
  68. @Override
  69. public Dialog getDialog() {
  70. if (mDialog != null) {
  71. return mDialog;
  72. }
  73. return super.getDialog();
  74. }
  75. public static class Builder<B extends BaseDialog.Builder> extends BaseDialog.Builder<B> {
  76. private FragmentActivity mActivity;
  77. private BaseDialogFragment mDialogFragment;
  78. public Builder(FragmentActivity activity) {
  79. super(activity);
  80. mActivity = activity;
  81. }
  82. /**
  83. * 获取当前 Activity 对象(仅供子类调用)
  84. */
  85. protected FragmentActivity getActivity() {
  86. return mActivity;
  87. }
  88. /**
  89. * 获取当前 DialogFragment 对象(仅供子类调用)
  90. */
  91. protected BaseDialogFragment getDialogFragment() {
  92. return mDialogFragment;
  93. }
  94. /**
  95. * 获取 Fragment 的标记
  96. */
  97. protected String getFragmentTag() {
  98. return getClass().getName();
  99. }
  100. /*
  101. // 重写父类的方法(仅供子类调用)
  102. @Override
  103. protected void dismiss() {
  104. try {
  105. mDialogFragment.dismiss();
  106. } catch (IllegalStateException e) {
  107. // java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
  108. // 这里不能调用 DialogFragment 的 dismiss 方法,因为在前台 show 之后却在后台 dismiss 会导致崩溃
  109. // 使用 Dialog 的 dismiss 方法却不会出现这种情况,除此之外没有更好的解决方案,故此这句 API 被注释
  110. }
  111. }
  112. */
  113. @Override
  114. public BaseDialog show() {
  115. final BaseDialog dialog = create();
  116. mDialogFragment = new BaseDialogFragment();
  117. mDialogFragment.setDialog(dialog);
  118. mDialogFragment.show(mActivity.getSupportFragmentManager(), getFragmentTag());
  119. // 解决 Dialog 设置了而 DialogFragment 没有生效的问题
  120. mDialogFragment.setCancelable(isCancelable());
  121. return dialog;
  122. }
  123. }
  124. }