Skip to content

Commit ba155ca

Browse files
committed
修复DialogFragment在特殊情况下无法显示和关闭问题
1 parent d5a2e62 commit ba155ca

6 files changed

Lines changed: 58 additions & 15 deletions

File tree

DialogFragmentUtilsLib/src/main/java/com/osard/dialogfragmentutilslib/BaseDialogLibUtils.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
import android.content.DialogInterface;
66
import android.content.res.Configuration;
77
import android.graphics.Point;
8+
import android.os.Handler;
9+
import android.os.Looper;
810
import android.util.Log;
911
import android.util.TypedValue;
1012
import android.view.Display;
@@ -13,6 +15,8 @@
1315

1416
import androidx.annotation.NonNull;
1517
import androidx.fragment.app.DialogFragment;
18+
import androidx.fragment.app.FragmentActivity;
19+
import androidx.fragment.app.FragmentManager;
1620

1721
import com.osard.dialogfragmentutilslib.init.DialogLibInitSetting;
1822
import com.osard.dialogfragmentutilslib.utils.DensityUtils;
@@ -41,6 +45,20 @@ public abstract class BaseDialogLibUtils extends DialogFragment implements Dialo
4145
protected Boolean reverseButton;
4246
protected boolean duplicateAliasClose = false;
4347

48+
protected Handler handler = new Handler(Looper.getMainLooper());
49+
protected Runnable showDialogRunnable = new Runnable() {
50+
@Override
51+
public void run() {
52+
FragmentActivity activity = (FragmentActivity) getContext();
53+
FragmentManager fragmentManager = activity.getSupportFragmentManager();
54+
if (!fragmentManager.isStateSaved()) {
55+
show(fragmentManager, getAlias());
56+
} else if (!activity.isFinishing() && !activity.isDestroyed()) {
57+
handler.postDelayed(this, 100);
58+
}
59+
}
60+
};
61+
4462
@NonNull
4563
public Context getContext() {
4664
return context;

DialogFragmentUtilsLib/src/main/java/com/osard/dialogfragmentutilslib/DialogLibAllCustom.java

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -135,14 +135,19 @@ public DialogLibAllCustom show(View customView) {
135135
}
136136
MAP.put(getAlias(), this);
137137
this.customView = customView;
138-
FragmentManager fragmentManager = ((FragmentActivity) getContext()).getSupportFragmentManager();
139-
show(fragmentManager, getAlias());
138+
handler.post(showDialogRunnable);
140139
return this;
141140
}
142141

143142
public boolean closeDialog() {
144143
try {
145-
dismiss();
144+
FragmentActivity activity = (FragmentActivity) getContext();
145+
FragmentManager fragmentManager = activity.getSupportFragmentManager();
146+
if (isAdded() && !fragmentManager.isStateSaved()) {
147+
dismiss(); // 优先用严格模式
148+
} else {
149+
dismissAllowingStateLoss(); // 保底方案
150+
}
146151
} catch (Exception e) {
147152
if (DialogLibInitSetting.getInstance().isDebug()) {
148153
Log.w(TAG, "关闭对话框异常", e);

DialogFragmentUtilsLib/src/main/java/com/osard/dialogfragmentutilslib/DialogLibCommon.java

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -394,14 +394,19 @@ public DialogLibCommon show() {
394394
MAP.get(getAlias()).closeDuplicateAliasDialog();
395395
}
396396
MAP.put(getAlias(), this);
397-
FragmentManager fragmentManager = ((FragmentActivity) getContext()).getSupportFragmentManager();
398-
show(fragmentManager, getAlias());
397+
handler.post(showDialogRunnable);
399398
return this;
400399
}
401400

402401
public boolean closeDialog() {
403402
try {
404-
dismiss();
403+
FragmentActivity activity = (FragmentActivity) getContext();
404+
FragmentManager fragmentManager = activity.getSupportFragmentManager();
405+
if (isAdded() && !fragmentManager.isStateSaved()) {
406+
dismiss(); // 优先用严格模式
407+
} else {
408+
dismissAllowingStateLoss(); // 保底方案
409+
}
405410
} catch (Exception e) {
406411
if (DialogLibInitSetting.getInstance().isDebug()) {
407412
Log.w(TAG, "关闭对话框异常", e);

DialogFragmentUtilsLib/src/main/java/com/osard/dialogfragmentutilslib/DialogLibCustom.java

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -332,14 +332,19 @@ public DialogLibCustom show(View customView) {
332332
}
333333
MAP.put(getAlias(), this);
334334
this.customView = customView;
335-
FragmentManager fragmentManager = ((FragmentActivity) getContext()).getSupportFragmentManager();
336-
show(fragmentManager, getAlias());
335+
handler.post(showDialogRunnable);
337336
return this;
338337
}
339338

340339
public boolean closeDialog() {
341340
try {
342-
dismiss();
341+
FragmentActivity activity = (FragmentActivity) getContext();
342+
FragmentManager fragmentManager = activity.getSupportFragmentManager();
343+
if (isAdded() && !fragmentManager.isStateSaved()) {
344+
dismiss(); // 优先用严格模式
345+
} else {
346+
dismissAllowingStateLoss(); // 保底方案
347+
}
343348
} catch (Exception e) {
344349
if (DialogLibInitSetting.getInstance().isDebug()) {
345350
Log.w(TAG, "关闭对话框异常", e);

DialogFragmentUtilsLib/src/main/java/com/osard/dialogfragmentutilslib/DialogLibInput.java

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -458,8 +458,7 @@ public DialogLibInput show() {
458458
MAP.get(getAlias()).closeDuplicateAliasDialog();
459459
}
460460
MAP.put(getAlias(), this);
461-
FragmentManager fragmentManager = ((FragmentActivity) getContext()).getSupportFragmentManager();
462-
show(fragmentManager, getAlias());
461+
handler.post(showDialogRunnable);
463462

464463
return this;
465464
}
@@ -496,7 +495,13 @@ protected void onReceiveResult(int resultCode, Bundle resultData) {
496495

497496
public boolean closeDialog() {
498497
try {
499-
dismiss();
498+
FragmentActivity activity = (FragmentActivity) getContext();
499+
FragmentManager fragmentManager = activity.getSupportFragmentManager();
500+
if (isAdded() && !fragmentManager.isStateSaved()) {
501+
dismiss(); // 优先用严格模式
502+
} else {
503+
dismissAllowingStateLoss(); // 保底方案
504+
}
500505
} catch (Exception e) {
501506
if (DialogLibInitSetting.getInstance().isDebug()) {
502507
Log.w(TAG, "关闭对话框异常", e);

DialogFragmentUtilsLib/src/main/java/com/osard/dialogfragmentutilslib/DialogLibLoading.java

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -185,9 +185,8 @@ public DialogLibLoading show() {
185185
}
186186
MAP.put(getAlias(), this);
187187

188-
FragmentManager fragmentManager = ((FragmentActivity) getContext()).getSupportFragmentManager();
189188
handler.removeCallbacks(timeoutRunnable);
190-
show(fragmentManager, getAlias());
189+
handler.post(showDialogRunnable);
191190
//如果设置了超时关闭,则时间到时关闭,反之需要手动关闭
192191
if (null != getTimeout()) {
193192
handler.postDelayed(timeoutRunnable, getTimeout());
@@ -203,7 +202,13 @@ public DialogLibLoading show() {
203202

204203
public boolean closeDialog() {
205204
try {
206-
dismiss();
205+
FragmentActivity activity = (FragmentActivity) getContext();
206+
FragmentManager fragmentManager = activity.getSupportFragmentManager();
207+
if (isAdded() && !fragmentManager.isStateSaved()) {
208+
dismiss(); // 优先用严格模式
209+
} else {
210+
dismissAllowingStateLoss(); // 保底方案
211+
}
207212
} catch (Exception e) {
208213
if (DialogLibInitSetting.getInstance().isDebug()) {
209214
Log.w(TAG, "关闭对话框异常", e);

0 commit comments

Comments
 (0)