【问题标题】:how to show dialogs in android taking screen orientation changes into account如何在考虑屏幕方向变化的android中显示对话框
【发布时间】:2011-03-28 21:41:52
【问题描述】:

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

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

我也有 Activity.onPrepareDialog() 我准备对话的地方。

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

这一切都很好,并且表现得很好。现在是棘手的部分。我旋转屏幕。它会破坏活动并创建一个新活动。 Activity.onCreate() 被调用,而后者又调用 showDialog(id),但那里已经有一个对话框,所以它最终调用了两次 onCreateDialog() 和两次 onPrepareDialog()。当屏幕方向发生变化并且您需要在 Activity.onCreate 中调用 showDialog 时,这里管理对话框的最佳方法是什么?

【问题讨论】:

    标签: android dialog screen orientation


    【解决方案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);
    }
    

    【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      您可以将 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();
          }
      

      }

      【讨论】:

        【解决方案4】:

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

        清单更改:

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

        【讨论】:

        • 如果我不关心轮换?我关心方向的变化。这就是让事情变得复杂的原因。
        猜你喜欢
        • 2011-01-09
        • 1970-01-01
        • 2017-01-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-02
        • 1970-01-01
        • 2018-01-07
        相关资源
        最近更新 更多