如果onSaveInstanceState方法调用过,延迟显示。参考文章:http://www.androiddesignpatterns.com/2013/08/fragment-transaction-commit-state-loss.html
方案一:写一个DialogFactory.java
public class DialogFactory {
private static final String DIALOG_LOADING_TAG = "loading_tag";
private FragmentManager mFragmentManager;
private DialogFragment mDialogFragment;
private boolean mActivityStateSaved;
private boolean mShowDialog;
private boolean mDismissDialog;
public void saveActivityState()
{
mActivityStateSaved = true;
}
public DialogFactory(FragmentManager fragmentManager){
this.mFragmentManager = fragmentManager;
}
public void showLoadingDialog(){
if(mActivityStateSaved)
{
mShowDialog = true;
mDismissDialog = false;
return;
}
mShowDialog = false;
showDialog(new LoadingDialog(), DIALOG_LOADING_TAG);
}
public void handleLoadingDialogOnResume(){
if(mActivityStateSaved)
{
if(mShowDialog)
{
showDialog(new LoadingDialog(), DIALOG_LOADING_TAG);
}
if(mDismissDialog)
{
dismissDialog(DIALOG_LOADING_TAG);
}
mActivityStateSaved = false;
}
mShowDialog = false;
mDismissDialog = false;
}
private void showDialog(DialogFragment dialogFragment, String tag){
if(mFragmentManager != null){
mDialogFragment = dialogFragment;
Fragment fragment = mFragmentManager.findFragmentByTag(tag);
if (fragment != null) {
FragmentTransaction ft = mFragmentManager.beginTransaction();
ft.remove(fragment);
ft.commitAllowingStateLoss();
}
dialogFragment.show(mFragmentManager, tag);
}
}
private void dismissDialog(String tag){
if(mFragmentManager != null)
{
Fragment fragment = mFragmentManager.findFragmentByTag(tag);
if (fragment != null) {
((LoadingDialog)fragment).dismiss();
FragmentTransaction ft = mFragmentManager.beginTransaction();
ft.remove(fragment);
ft.commitAllowingStateLoss();
// mFragmentManager.beginTransaction().remove(fragment);
}
}
}
public void dismissLoadingDialog(){
if(mActivityStateSaved)
{
mDismissDialog = true;
mShowDialog = false;
return;
}
mDismissDialog = false;
dismissDialog(DIALOG_LOADING_TAG);
}
public boolean isShowing()
{
return mDialogFragment != null && mDialogFragment.getDialog() != null && mDialogFragment.getDialog().isShowing();
}
}
方案二、写一个消息队列
public abstract class PauseHandler extends Handler {
/**
* Message Queue Buffer
*/
private final List<Message> messageQueueBuffer = Collections.synchronizedList(new ArrayList<Message>());
/**
* Flag indicating the pause state
*/
private Activity activity;
/**
* Resume the handler.
*/
public final synchronized void resume(Activity activity) {
this.activity = activity;
while (messageQueueBuffer.size() > 0) {
final Message msg = messageQueueBuffer.get(0);
messageQueueBuffer.remove(0);
sendMessage(msg);
}
}
/**
* Pause the handler.
*/
public final synchronized void pause() {
activity = null;
}
/**
* Store the message if we have been paused, otherwise handle it now.
*
* @param msg Message to handle.
*/
@Override
public final synchronized void handleMessage(Message msg) {
if (activity == null) {
final Message msgCopy = new Message();
msgCopy.copyFrom(msg);
messageQueueBuffer.add(msgCopy);
} else {
processMessage(activity, msg);
}
}
/**
* Notification message to be processed. This will either be directly from
* handleMessage or played back from a saved message when the activity was
* paused.
*
* @param activity Activity owning this Handler that isn't currently paused.
* @param message Message to be handled
*/
protected abstract void processMessage(Activity activity, Message message);}