如何从处理程序显示DialogFragment

时间:2012-02-02 00:29:11

标签: android android-fragments android-dialog android-dialogfragment

我有一个Handler,它在收到特定消息时显示DialogFragment。这通常有效,但如果片段已经保存,我会收到以下错误:

  

E / AndroidRuntime(3898):致命异常:主要   E / AndroidRuntime(3898):java.lang.IllegalStateException:onSaveInstanceState后无法执行此操作   E / AndroidRuntime(3898):在android.support.v4.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1299)   E / AndroidRuntime(3898):在android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1310)   E / AndroidRuntime(3898):在android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:541)   E / AndroidRuntime(3898):在android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:525)   E / AndroidRuntime(3898):在android.support.v4.app.DialogFragment.show(DialogFragment.java:123)   E / AndroidRuntime(3898):at com.malauzai.app.BaseActivity $ 2.handleMessage(BaseActivity.java:72)   E / AndroidRuntime(3898):在android.os.Handler.dispatchMessage(Handler.java:99)

现在,我知道这是预期的,基于Javadoc for FragmentManager.beginTransaction:

  

注意:片段事务只能在活动保存其状态之前创建/提交。如果您尝试在Activity.onSaveInstanceState()之后(以及之后的Activity.onStart或Activity.onResume()之前提交事务,则会出现错误。这是因为框架负责将当前片段保存在状态中如果在状态保存后进行了更改,那么它们将会丢失。

我的问题是我无法告诉如何防止它。我尝试在Handler.removeMessages()上调用onPause(),但它仍然会发生。我已尝试在onSaveInstanceState()中设置一个标志,如果已设置则不显示该片段,但它仍然会出现。这似乎是一个非常常见的问题,但我无法想出一个有效的解决方案。基本上,我怎么知道片段已经保存了?

顺便说一句,这发生在我的BaseActivity(扩展FragmentActivity)上,但是每个活动都有自己的处理程序,所以我认为这不应该是一个问题。

我的最后一个想法是使用Fragment.commitAllowingStateLoss(),但这似乎是一个黑客。

修改 这是导致我出现问题的代码:

private final Handler mTimerHandler = new Handler() {
      @Override
      public void handleMessage(Message msg) {
        switch (msg.what) {
        case TIMER_MESSAGE_LOGOUT_WARNING:
            // throws IllegalStateException if fragment is already saved
            new LogoutWarningDialog().show(getSupportFragmentManager(),
                    "dialog");
            break;
        }
      }
};

1 个答案:

答案 0 :(得分:1)

我在答案中假设您正在使用FragmentManager并通过FragmentTransacts使用标签(或ID)添加Fragments。 所以基本上在你的BaseActivity内你可以做这样的事情

FragmentManager manager = getFragmentSupportedManager();
Fragment fragmentIWannaKnowIfexists = manager.findFragmentByTag("Tag I used to create this Fragment inside FragmentTrasnsaction")
// or manager.findFragmentById(ID_FROM_LAYOUT)
if(fragmentIWannaKnowIfexists != null){
    //we have this Fragment already
} else {
    // this Fragment was not added already
}
相关问题