how to show dialogs in android taking screen orientation changes into account

懵懂的女人 提交于 2019-12-23 04:40:14

问题


this is driving me crazy. i have read the documentation for creating dialogs in Android and it seems to make sense, except when the screen orientation changes.

I have Activity.onCreateDialog() where I create the dialog.

I also have Activity.onPrepareDialog() where I prepare the dialog.

Then in my Activity.onCreate() method, I call showDialog(id)

that's all well and good and behaves properly. now comes the tricky part. I rotate the screen. it destroys the activity and creates a new one. Activity.onCreate() gets called, which in turn calls showDialog(id), but there's already a dialog out there, so it winds up calling onCreateDialog() twice and onPrepareDialog() twice. What is the best approach here for managing a dialog when the screen orientation changes and you need to call showDialog in Activity.onCreate ?


回答1:


You can save your dialog instance in the bundle inside the method onSaveInstaceState and show the dialog again inside the method 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);
}



回答2:


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

As stated on that page:

Change to:

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);
   ....

}



回答3:


You can implement your Dialog as a singleton .

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

}




回答4:


if you don't care about rotation you can create your own code for managing this:

Manifest Change:

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


来源:https://stackoverflow.com/questions/5465422/how-to-show-dialogs-in-android-taking-screen-orientation-changes-into-account

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!