谷歌建议我们使用DialogFragment而不是简单Dialog的使用Fragments API,但使用隔离DialogFragment的简单的是 - 否确认消息框是荒谬的.在这种情况下,最佳做法是什么?
android android-fragments android-dialog android-dialogfragment
我有一个托管DialogFragment的FragmentActivity.
DialogFragment执行网络请求并处理Facebook身份验证,因此我需要在轮换期间保留它.
我已经阅读了有关这个问题的所有其他问题,但没有一个问题能解决这个问题.
我正在使用putFragment和getFragment来保存Fragment实例,并在重新创建活动期间再次获取它.
但是,我总是在onRestoreInstanceState中调用getFragment时得到一个空指针异常.我还希望防止对话在轮换期间被解雇,但到目前为止,我甚至无法保留它的实例.
有什么想法会出错吗?
这是我的代码目前的样子:
public class OKLoginActivity extends FragmentActivity implements OKLoginDialogListener
{
private OKLoginFragment loginDialog;
private static final String TAG_LOGINFRAGMENT = "OKLoginFragment";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
FragmentManager fm = getSupportFragmentManager();
if(savedInstanceState == null)
{
loginDialog = new OKLoginFragment();
loginDialog.show(fm, TAG_LOGINFRAGMENT);
}
}
@Override
public void onSaveInstanceState(Bundle outState)
{
getSupportFragmentManager().putFragment(outState,TAG_LOGINFRAGMENT, loginDialog);
}
@Override
public void onRestoreInstanceState(Bundle inState)
{
FragmentManager fm = getSupportFragmentManager();
loginDialog = (OKLoginFragment) fm.getFragment(inState, TAG_LOGINFRAGMENT);
}
}
Run Code Online (Sandbox Code Playgroud)
这是异常堆栈跟踪:
02-01 16:31:13.684: E/AndroidRuntime(9739): FATAL EXCEPTION: …Run Code Online (Sandbox Code Playgroud) android android-fragments android-dialogfragment android-fragmentactivity
旋转屏幕后如何恢复对话框等?例如,弹出一个alertDialog来告诉用户一些信息.然后用户将屏幕旋转到另一个方向.如何恢复alertDialog?任何人都可以指导我这样做吗?谢谢!
稍后附上:
我查看了android源代码并找到了这些东西:
对话框存储在mManagedDialogs,相关信息是:
mManagedDialogs = new SparseArray<ManagedDialog>();
Run Code Online (Sandbox Code Playgroud)
onSaveInstanceState 有关:
final void performSaveInstanceState(Bundle outState) {
onSaveInstanceState(outState);
saveManagedDialogs(outState);
}
Run Code Online (Sandbox Code Playgroud)
在saveManagedDialogs,它有一些关系mManagedDialogs.
onRestoreInstanceState 有关:
final void performRestoreInstanceState(Bundle savedInstanceState) {
onRestoreInstanceState(savedInstanceState);
restoreManagedDialogs(savedInstanceState);
}
Run Code Online (Sandbox Code Playgroud)
在restoreManagedDialogs,它有一些关系mManagedDialogs.
如您所见,对于高级功能,您必须自己执行保存和恢复工作.当你有吨定制的对话框时,它可能是一个夜晚的母马.我没有尝试过复杂的对话框(输入EdiText,listView,比如说).这样,我想警告用户:在对话框中输入信息时不要旋转屏幕...或者,在显示对话框时动态锁定旋转.
感谢所有回答我的人.希望我的信息对你也有帮助.
经过对这个论坛的长时间搜索,我找到了很多答案,人们建议使用解决方案来避免轮换后对话被解雇,就像:
android:configChanges="keyboardHidden|orientation"
Run Code Online (Sandbox Code Playgroud)
或者覆盖以下方法,这似乎是最推荐的方法:
protected Dialog onCreateDialog(int id)
Run Code Online (Sandbox Code Playgroud)
但是,在查看Android参考文档后,我注意到这些Dialog方法已被弃用.
所以,显而易见的问题是:
今天,在设备轮换后避免Dialogs解散的最佳方法是什么?
提前致谢.
我想弄清楚 onSaveInstanceState/onRestoreInstanceState 如何与对话框一起工作。使用 Acitivity 很容易,因为它们在 Activity 被终止/重新启动时被调用。
我们的 Activity 显示一个登录对话框。对话框的 onSaveInstanceState/onRestoreInstanceState 什么时候被调用?
当我们解开对象时它会自动调用吗?