如何在Android中显示对话框,将屏幕方向更改考虑在内

时间:2011-03-28 21:41:53

标签: android dialog screen orientation

这让我发疯了。我已经阅读了在Android中创建对话框的文档,除非屏幕方向发生变化,否则它似乎有意义。

我有Activity.onCreateDialog() 我在哪里创建对话框。

我也有Activity.onPrepareDialog() 我在哪里准备对话框。

然后在我的Activity.onCreate()方法中, 我叫showDialog(id)

这一切都很好,行为也很好。现在是棘手的部分。我旋转屏幕。它会摧毁活动并创造一个新的活动。调用Activity.onCreate(),然后调用showDialog(id),但是那里已经有了一个对话框,所以最终调用onCreateDialog()两次,onPrepareDialog()两次。当屏幕方向改变并且您需要在Activity.onCreate中调用showDialog时,此处管理对话框的最佳方法是什么?

4 个答案:

答案 0 :(得分:1)

您可以在方法onSaveInstaceState内的包中保存对话框实例,并在方法onRestoreInstanceState

中再次显示对话框
@Override
protected void onSaveInstanceState(Bundle outState) {
    outState.putInt("dialog", DIALOG_ID);
    super.onSaveInstanceState(outState);
}

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
    if(savedInstanceState.containsKey("dialog")){
        showDialog(DIALOG_ID);
    }
    super.onRestoreInstanceState(savedInstanceState);
}

答案 1 :(得分:1)

http://groups.google.com/group/android-developers/browse_thread/thread/bf4c7798ee378d2

正如该页面所述:

  

更改为:

public void onCreate(Bundle bundle)
{
   ....
   //  bundle is null on first start, non-null on restart
   // [rather than just "if (condition is true)"]
   if (condition is true && bundle == null)
       showDialog(42);
   ....

}

答案 2 :(得分:0)

您可以将对话框实现为单身。

static class MyProgressDialog extends ProgressDialog 
    {

    private static MyProgressDialog dialog = null;

    static MyProgressDialog newInstance( Context context )
    {
        if ( dialog == null )
        {
            dialog = new MyProgressDialog( context );


        }
        return dialog;
    }
    static MyProgressDialog getInstance()
    {

            return dialog ; 

    }

    public static  void destroyInstance()
    {
        if(dialog!= null && dialog.isShowing() ){
        dialog.dismiss(); 

        }
        dialog= null;
    }

    private MyProgressDialog( Context context )
        {
        super( context );
        }


    }

    @Override
   protected void onDestroy()
    {
    super.onDestroy();

    if ( progressDialog != null && progressDialog.isShowing() )
    {

        progressDialog.dismiss();

    }
    if( MyProgressDialog.getInstance()!= null){
      MyProgressDialog.destroyInstance();
    }

}

答案 3 :(得分:-1)

如果您不关心轮换,可以创建自己的代码来管理:

明显改变:

    <activity android:name=".MainActivity" android:label="@string/app_name" 
android:configChanges="orientation">