2

我有一个相当简单的 DialogFragment。它看起来像:

import android.support.v4.app.DialogFragment;

public class MyDialogFragment extends DialogFragment {

    private String mData = "empty";

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d(LOG_TAG, "onCreate");

        setStyle(DialogFragment.STYLE_NO_TITLE, 0);
        // setRetainInstance(true);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        View view = inflater.inflate(R.layout.mydialog, container);

        ....

        return view;
    }

    public setData(String _data) {
        mData = _data;
    }
}

我像这样从我的加载这个片段FragmentActivity

FragmentManager lFM = getSupportFragmentManager();
MyDialogFragment lDialog = new MyDialogFragment();
lDialog.setData("not empty");
lDialog.show(lFM, "MyDialog");

上面的代码工作正常。但是,我想将片段保留在方向开关上,以便保留 mData 字段。如果我添加setRetainInstance(true);(并且在进行一些调试之后)我可以看到片段确实保留在方向开关上 -onCreate()这次没有被调用。我可以看到onCreateView()正在被调用并且我返回了一个正确的View对象,但是屏幕上没有显示对话框。我错过了什么?

4

3 回答 3

1

在阅读了baboo给我的答案后,我实现了如下解决方案..我希望这是正确的(至少它可以正常工作......)

@Override
public void onCreate(Bundle savedInstanceState) {

  // ....

  FragmentManager lFM = getSupportFragmentManager();
  if(lFM.findFragmentByTag("MyDialog")!=null)
    ((MyDialogFragment)lFM.findFragmentByTag("MyDialog")).show(lFM, "MyDialog");

  // ....
}
于 2013-02-04T16:33:31.630 回答
0

在您的片段活动中尝试以下逻辑:

使用 put 方法将值存储在 onSaveInstanceState() 中:

protected void onSaveInstanceState(Bundle icicle) {
  super.onSaveInstanceState(icicle);
  icicle.putBoolean("dialogDisplayed", value);    // set value = true when displayin dialog...
}

并恢复 onCreate() 中的值:

 public void onCreate(Bundle icicle) {
   if (icicle != null){
     value = icicle.getBoolean("dialogDisplayed");
   }
   if(value)
       //Display Dialog here.... 

 }
于 2013-01-31T08:01:47.777 回答
-1

只要您执行以下操作,就应该自动保留对话框片段:

  1. 如果您调用 Activity onSaveInstanceState(),请确保调用超级函数!!!!. 就我而言,这是关键。还要确保你在 Fragment 中做同样的事情。
  2. 如果您使用setRetainInstance,您将需要手动存储这些值并重新应用它们。否则,在大多数情况下,您应该不必担心。如果你正在做一些更复杂的事情,你可能需要setRetainInstance(true),否则忽略它。就我而言,我需要用它来为我的一个课程存储一个随机种子,但除此之外我还可以。
  3. 有些人抱怨支持库中的一个错误,即在不应该发送关闭消息时发送。最新的支持库似乎已经解决了这个问题,所以你不必担心这个问题。

您不需要做任何花哨的事情,例如手动存储片段,如果您按照这些步骤操作,它应该会自动完成。

于 2013-12-31T11:24:39.397 回答