您好我正在尝试实施一个教程对话框,其中一个对话框将在另一个对话框被解除后出现。现在一切正常,但在方向改变后,对话框会重新创建两次。在我解除所有对话框然后再次尝试改变方向后,对话框将重新出现,这很烦人。到目前为止,这是我的代码:
public class TutorialOne extends DialogFragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.dialog_tutorial1, container, false);
Button next = (Button) view.findViewById(R.id.btn_next);
next.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
getDialog().dismiss();
}
});
return view;
}
@Override
public void onDetach() {
super.onDetach();
if(isRemoving()) {
TutorialTwo tutorialTwo = new TutorialTwo();
tutorialTwo.show(getActivity().getSupportFragmentManager(), "tutorial_2");
}
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
Dialog dialog = super.onCreateDialog(savedInstanceState);
// request a window without the title
dialog.getWindow().requestFeature(Window.FEATURE_NO_TITLE);
dialog.getWindow().setBackgroundDrawableResource(android.R.color.transparent);
return dialog;
}
}
我错过了什么吗?
答案 0 :(得分:2)
This answer这是目前接受的答案,可以使用,但将来会给你带来麻烦。有关详细信息,请阅读Android开发者文档中的this guide。特别是,"处理配置改变自己"部分说:
注意:自行处理配置更改会使使用其他资源变得更加困难,因为系统不会自动为您应用这些资源。当您必须避免因配置更改而重新启动时,此技术应被视为最后的手段,并且不建议用于大多数应用程序。
回到原来的问题,我认为您应该将用于显示第二个对话框的代码从onDetach()
移动到onClick()
。
next.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
getDialog().dismiss();
showTutorial2Dialog();
}
});
private void showTutorial2Dialog(){
TutorialTwo tutorialTwo = new TutorialTwo();
tutorialTwo.show(getActivity().getSupportFragmentManager(), "tutorial_2");
}
您可能需要使用getDialog().dismiss()
和showTutorial2Dialog()
来电的顺序来完成此工作。
答案 1 :(得分:1)
void dismiss()
关闭片段及其对话框。
而不是getDialog().dismiss()
调用dismiss()
,因为这会破坏Dialog
和Fragment
,因此不会重新创建。
答案 2 :(得分:0)
尝试将以下代码添加到DialogFragment:
@Override
public void onDestroyView() {
if (getDialog() != null && getRetainInstance())
getDialog().setDismissMessage(null);
super.onDestroyView();
}
您需要覆盖onPrepareDialog
并保留一个常数ID
答案 3 :(得分:0)
您还可以实现DialogInterface.OnClickListener和DialogInterface.OnCancelListener:
@Override
public void onClick(DialogInterface dialog, int which)
{
// Your "onClick" code here
this.dismiss(); // only if you close dialog after "onClick"
}
@Override
public void onCancel(DialogInterface dialog)
{
// Your "onCancel" code here
this.dismiss(); // also handle click outside the dialog
}
答案 4 :(得分:-1)
改进
某些设备配置可能会在运行时更改(例如屏幕方向,键盘可用性和语言)。当发生这样的更改时,Android会重新启动正在运行的Activity(调用onDestroy(),然后调用onCreate())。重新启动行为旨在通过使用与新设备配置匹配的备用资源自动重新加载应用程序来帮助您的应用程序适应新配置。
有两种方法来处理这个
Retain an object during a configuration change
Allow your activity to restart when a configuration changes, but carry a stateful object to the new instance of your activity.
Handle the configuration change yourself
Prevent the system from restarting your activity during certain configuration changes, but receive a callback when the
configurations do change, so that you can manually update your
activity as necessary.
如果您不想重新创建活动并手动处理配置更改,请按照以下两种方式,configchanges添加以下项目清单
机器人:configChanges = “取向| keyboardHidden”
现在,当其中一个配置发生更改时,MyActivity不会重新启动。相反,MyActivity接收对onConfigurationChanged()
的调用 @Override
public void onConfigurationChanged(Configuration newConfig) {
// TODO Auto-generated method stub
super.onConfigurationChanged(newConfig);
}
注意:document
不建议处理运行时更改