DialogFragment / orientation开关

时间:2013-01-30 14:54:54

标签: android android-dialogfragment

我有一个相当简单的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对象,但屏幕上没有显示该对话框。我错过了什么?

3 个答案:

答案 0 :(得分:1)

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

@Override
public void onCreate(Bundle savedInstanceState) {

  // ....

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

  // ....
}

答案 1 :(得分: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.... 

 }

答案 2 :(得分:-1)

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

  1. 如果您调用Activity onSaveInstanceState(),请确保调用超级函数!!!! 。就我而言,这是关键。还要确保你在Fragment中做同样的事情。
  2. 如果您使用setRetainInstance,则需要手动存储值并重新应用它们。否则,在大多数情况下,你应该不用担心它。如果你做的事情有点复杂,你可能需要setRetainInstance(true),否则忽略它。在我的情况下,我需要使用它为我的一个班级存储一个随机种子,否则我没事。
  3. 有些人抱怨支持库中存在一个错误,其中不应该发送解雇消息。最新的支持库似乎已经修复了,因此您不必担心这一点。
  4. 您不应该像手动存储片段那样做任何奇特的事情,如果您按照这些步骤操作,它应该自动完成。