как показывать диалоги в андроиде с учетом изменения ориентации экрана - PullRequest
0 голосов
/ 29 марта 2011

это сводит меня с ума. Я прочитал документацию по созданию диалогов в Android, и, кажется, это имеет смысл, за исключением случаев, когда меняется ориентация экрана.

У меня есть Activity.onCreateDialog () где я создаю диалог.

У меня также есть Activity.onPrepareDialog () где я готовлю диалог.

Тогда в моем методе Activity.onCreate () Я вызываю showDialog (id)

это все хорошо, и ведет себя правильно. Теперь начинается сложная часть. Я поворачиваю экран. это разрушает деятельность и создает новую. Вызывается Activity.onCreate (), который, в свою очередь, вызывает showDialog (id), но там уже есть диалог, поэтому он вызывает метод onCreateDialog () дважды и дважды onPrepareDialog (). Каков наилучший подход для управления диалогом, когда ориентация экрана меняется, и вам нужно вызвать showDialog в Activity.onCreate?

Ответы [ 4 ]

1 голос
/ 30 марта 2011

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

}
1 голос
/ 29 марта 2011

Вы можете сохранить свой экземпляр диалога в комплекте внутри метода 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);
}
0 голосов
/ 28 мая 2013

Вы можете реализовать Dialog как синглтон.

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

}

0 голосов
/ 29 марта 2011

если вас не волнует ротация, вы можете создать свой собственный код для управления этим:

Изменение манифеста:

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