我一生都无法弄清楚如何在不使用 configChanges 来指定您要手动处理方向更改的情况下管理对话框。所以假设你有这个 AndroidManifest:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.testandroid"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="15" />
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/title_activity_main" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
拿这个 MainActivity.java:
package com.example.testandroid;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.app.Dialog;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.View;
public class MainActivity extends Activity {
private final static String TAG = "MainActivity";
Dialog mDialog = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d(TAG, "onCreate");
setContentView(R.layout.activity_main);
}
public void doShowDialog(View b) {
Log.d(TAG, "doShowDialog");
showDialog(1);
}
private void tryDismiss() {
Log.d(TAG, "tryDismiss");
try {
dismissDialog(1);
removeDialog(1);
mDialog.dismiss();
} catch(IllegalArgumentException ex) {
Log.e(TAG, ex.getMessage());
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
@Override
protected void onPause() {
tryDismiss();
super.onPause();
Log.d(TAG, "onPause");
}
@Override
protected Dialog onCreateDialog(int dialog) {
Builder b = new AlertDialog.Builder(this);
b.setTitle("Hello").setMessage("Waiting..");
mDialog = b.create();
return mDialog;
}
}
和这个布局(main.xml)
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Open Dialog"
android:onClick="doShowDialog"
/>
</LinearLayout>
如果您从 onDestroy 或 onPause 调用似乎并不重要,对话框会在方向切换后重新显示。但为什么?我告诉它走开。如果调用 removeDialog/dismissDialog 在方向改变之前调用它什么也不做。我终其一生都无法弄清楚为什么会这样。我所知道的摆脱这种情况的唯一方法是自己处理方向变化,方法是使用
android:configChanges="keyboardHidden|orientation"
我知道新的工作方式是使用我尚未升级到的 FragmentDialog 的东西,并且还没有准备好为此重写我的整个应用程序。这不起作用似乎很奇怪。
这只是我在我的应用程序中遇到的一个真实世界问题的一个示例,用户可以请求从远程服务器中提取一些数据(以更新微调器的数据),如果他们切换方向,加载对话框将永远不会消失除了使用 android:configChanges 选项处理方向更改之外,似乎没有解决此问题的方法。我可以做到,但对我来说不得不这样做似乎很荒谬。
-- 更新 -- 删除了关闭对话框的按钮,因为它不是必需的,而且由于对话框位于顶部,因此无论如何您都无法单击它。
要重现只需启动应用程序,单击打开对话框的按钮,然后旋转手机。