我有一个相当简单的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
对象,但屏幕上没有显示该对话框。我错过了什么?
答案 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)
只要执行以下操作,就应自动保留对话框片段:
setRetainInstance
,则需要手动存储值并重新应用它们。否则,在大多数情况下,你应该不用担心它。如果你做的事情有点复杂,你可能需要setRetainInstance(true)
,否则忽略它。在我的情况下,我需要使用它为我的一个班级存储一个随机种子,否则我没事。您不应该像手动存储片段那样做任何奇特的事情,如果您按照这些步骤操作,它应该自动完成。