如何在ProgressDialog显示时处理屏幕方向变化?

17

我正在AsyncTask对象的onPreExecute方法中显示一个ProgressDialog,并在onPostExecute方法中取消该对话框。在doInBackground方法中,我正在进行用户注册的HTTP请求。我希望屏幕方向可以改变。当我在doInBackground方法仍在运行时更改方向时,我会得到各种有趣的错误,例如“IllegalArgumentException:View not attached to window manager”和“RegisterScreen has leaked window...”

如何在方向更改后正确地继续显示ProgressDialog?或者,当用户请求提交其注册时,如何禁用方向更改?


我认为这就是你正在寻找的解决方案。 - dvrm
6个回答

15
尝试在AndroidManifest.xml文件中的Activity元素上添加android:configChanges="orientation"属性。

这就做到了!我真是太傻了,我应该知道这就是解决方法。 - james
8
为了针对API级别13及以上的环境,我不得不添加“screenSize”。否则,在这些环境下它无法正常工作。android:configChanges="orientation|screenSize" - notmystyle
谢谢你提供的屏幕尺寸提示!我之前使用了“orientation|keyboard”,但突然间它就不起作用了。现在这个提示完美地解决了我的问题,非常感谢! - TSGames

6
您可以尝试在显示ProgressDialog时禁用屏幕方向更改。

在开始时执行以下操作:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR);

完成后启用:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);

希望这可以帮到你。(如果有人有正确的解决方案,我也很感兴趣 :-)

2
问题不在于屏幕方向的改变。您看到这些问题是因为活动生命周期的影响,它会销毁并重新创建您的活动。防止屏幕方向的改变将防止生命周期的这一特定实例,但当用户在ProgressDialog期间按下“Home”键并返回时,同样的问题会出现。您的活动应该设计成可以随时关闭和重启。 - Josh
如果我的AsyncTask不在我的Activity中,而是在另一个常见于许多Activity类的类文件中,那么我该如何获取setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR)? - Debopam Mitra
很棒,但对我来说锁定方向ActivityInfo.SCREEN_ORIENTATION_LOCKED更好,特别是在横屏模式下。 - NiPfi

4

2
将以下代码添加到应用程序manifest.xml文件中的activity标签中:

<activity android:label="@string/app_name" android:configChanges="keyboardHidden|orientation|screenSize" android:name=".your.package"/>


1
在我的情况下,我使用了。
android:configChanges="orientation" 

但是对我没有起作用。 以下内容正常运行。
<activity android:name=".MyActivity" 
          android:configChanges="orientation|screenSize|screenLayout">
</activity>

-1
您可以在您的清单文件中使用以下代码。
<activity android:label="@string/app_name" 
        android:configChanges="orientation|keyboardHidden" 
        android:name=".your.package">

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接