方向更改后,DialogFragment创建两次

时间:2014-10-27 04:37:04

标签: android android-dialogfragment

您好我正在尝试实施一个教程对话框,其中一个对话框将在另一个对话框被解除后出现。现在一切正常,但在方向改变后,对话框会重新创建两次。在我解除所有对话框然后再次尝试改变方向后,对话框将重新出现,这很烦人。到目前为止,这是我的代码:

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;
    }

}

我错过了什么吗?

5 个答案:

答案 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)

Documentation

  

void dismiss()

     

关闭片段及其对话框。

而不是getDialog().dismiss()调用dismiss(),因为这会破坏DialogFragment,因此不会重新创建。

答案 2 :(得分:0)

尝试将以下代码添加到DialogFragment:

@Override
 public void onDestroyView() {
     if (getDialog() != null && getRetainInstance())
         getDialog().setDismissMessage(null);
     super.onDestroyView();
 }

您需要覆盖onPrepareDialog并保留一个常数ID

  • 实施onCreateDialog方法
  • 实施onPrepareDialog 方法
  • 使用自定义对话框ID保持不变
  • 调用showDialog方法以显示对话框
  • 调用removeDialog或dismissDialog方法从屏幕上删除对话框

Refer this to get more info

答案 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())。重新启动行为旨在通过使用与新设备配置匹配的备用资源自动重新加载应用程序来帮助您的应用程序适应新配置。

有两种方法来处理这个

  1. 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.
    
  2. 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”

  3. 现在,当其中一个配置发生更改时,MyActivity不会重新启动。相反,MyActivity接收对onConfigurationChanged()

    的调用
     @Override
    public void onConfigurationChanged(Configuration newConfig) {
        // TODO Auto-generated method stub
        super.onConfigurationChanged(newConfig);
    }
    

    注意:document

    不建议处理运行时更改