Spinner下拉列表和屏幕方向更改问题

4
我有一个与Spinner下拉列表和更改方向有关的问题。
在我的Activity中,我显示一个对话框,其中有两个Spinner。当向用户显示对话框并且用户更改屏幕方向时,一切都正常 - 在我的onPause中,我只需简单地关闭对话框即可。
如果用户点击Spinner,则会在更改方向之前向用户显示下拉列表。但是,如果用户没有从下拉列表中选择任何内容,而只是在更改方向之前保留了列表,则会遇到错误。
我尝试了许多方法来解决这个问题(例如在onSaveInstanceState()中使用spinner.setSelection(0)等)。我的想法是,当用户不选择项目并发生方向更改时,从代码中关闭下拉列表。
错误信息为Android.WindowLeaked:
E/WindowManager( 2455): Activity pl.myapp.WebViewActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@45041e60 that was originally added here
E/WindowManager( 2455): android.view.WindowLeaked: Activity pl.myapp.WebViewActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@45041e60 that was originally added here
E/WindowManager( 2455):     at android.view.ViewRoot.<init>(ViewRoot.java:247)
E/WindowManager( 2455):     at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:148)
E/WindowManager( 2455):     at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
E/WindowManager( 2455):     at android.view.Window$LocalWindowManager.addView(Window.java:424)
E/WindowManager( 2455):     at android.app.Dialog.show(Dialog.java:241)
E/WindowManager( 2455):     at android.app.AlertDialog$Builder.show(AlertDialog.java:802)
E/WindowManager( 2455):     at android.widget.Spinner.performClick(Spinner.java:257)
E/WindowManager( 2455):     at android.view.View$PerformClick.run(View.java:8816)
E/WindowManager( 2455):     at android.os.Handler.handleCallback(Handler.java:587)
E/WindowManager( 2455):     at android.os.Handler.dispatchMessage(Handler.java:92)
E/WindowManager( 2455):     at android.os.Looper.loop(Looper.java:123)
E/WindowManager( 2455):     at android.app.ActivityThread.main(ActivityThread.java:4627)
E/WindowManager( 2455):     at java.lang.reflect.Method.invokeNative(Native Method)
E/WindowManager( 2455):     at java.lang.reflect.Method.invoke(Method.java:521)
E/WindowManager( 2455):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
E/WindowManager( 2455):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
E/WindowManager( 2455):     at dalvik.system.NativeStart.main(Native Method)

此外,还出现了这个错误:
D/AndroidRuntime( 2455): Shutting down VM
W/dalvikvm( 2455): threadid=1: thread exiting with uncaught exception (group=0x4001d800)
E/AndroidRuntime( 2455): FATAL EXCEPTION: main
E/AndroidRuntime( 2455): java.lang.IllegalArgumentException: View not attached to window manager
E/AndroidRuntime( 2455):    at android.view.WindowManagerImpl.findViewLocked(WindowManagerImpl.java:355)
E/AndroidRuntime( 2455):    at android.view.WindowManagerImpl.removeView(WindowManagerImpl.java:200)
E/AndroidRuntime( 2455):    at android.view.Window$LocalWindowManager.removeView(Window.java:432)
E/AndroidRuntime( 2455):    at android.app.Dialog.dismissDialog(Dialog.java:278)
E/AndroidRuntime( 2455):    at android.app.Dialog.access$000(Dialog.java:71)
E/AndroidRuntime( 2455):    at android.app.Dialog$1.run(Dialog.java:111)
E/AndroidRuntime( 2455):    at android.app.Dialog.dismiss(Dialog.java:268)
E/AndroidRuntime( 2455):    at android.widget.Spinner.onDetachedFromWindow(Spinner.java:86)
E/AndroidRuntime( 2455):    at android.view.View.dispatchDetachedFromWindow(View.java:6033)
E/AndroidRuntime( 2455):    at android.view.ViewGroup.dispatchDetachedFromWindow(ViewGroup.java:1158)
E/AndroidRuntime( 2455):    at android.view.ViewGroup.dispatchDetachedFromWindow(ViewGroup.java:1156)
E/AndroidRuntime( 2455):    at android.view.ViewGroup.dispatchDetachedFromWindow(ViewGroup.java:1156)
E/AndroidRuntime( 2455):    at android.view.ViewGroup.dispatchDetachedFromWindow(ViewGroup.java:1156)
E/AndroidRuntime( 2455):    at android.view.ViewGroup.dispatchDetachedFromWindow(ViewGroup.java:1156)
E/AndroidRuntime( 2455):    at android.view.ViewGroup.dispatchDetachedFromWindow(ViewGroup.java:1156)
E/AndroidRuntime( 2455):    at android.view.ViewGroup.dispatchDetachedFromWindow(ViewGroup.java:1156)
E/AndroidRuntime( 2455):    at android.view.ViewGroup.dispatchDetachedFromWindow(ViewGroup.java:1156)
E/AndroidRuntime( 2455):    at android.view.ViewRoot.dispatchDetachedFromWindow(ViewRoot.java:1630)
E/AndroidRuntime( 2455):    at android.view.ViewRoot.doDie(ViewRoot.java:2671)
E/AndroidRuntime( 2455):    at android.view.ViewRoot.handleMessage(ViewRoot.java:1948)
E/AndroidRuntime( 2455):    at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime( 2455):    at android.os.Looper.loop(Looper.java:123)
E/AndroidRuntime( 2455):    at android.app.ActivityThread.main(ActivityThread.java:4627)
E/AndroidRuntime( 2455):    at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime( 2455):    at java.lang.reflect.Method.invoke(Method.java:521)
E/AndroidRuntime( 2455):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
E/AndroidRuntime( 2455):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
E/AndroidRuntime( 2455):    at dalvik.system.NativeStart.main(Native Method)

编辑

解决方案:

最后我找到了导致这个*&#$%错误的原因。在我的Activity清单文件中,我有android:configChanges="orientation",当我把它改成android:configChanges="keyboardHidden|orientation"时,问题就消失了!

谢谢帮助!

3个回答

1

是的,这不是最好的方法。请参见此处的说明http://developer.android.com/guide/topics/resources/runtime-changes.html#HandlingTheChange并自己保存和恢复状态。大多数情况下,您将想要执行该页面顶部所解释的操作:“为正确处理重新启动,重要的是您的活动通过正常活动生命周期还原其先前的状态,在其中Android在销毁活动之前调用onSaveInstanceState()以便您可以保存有关应用程序状态的数据。然后您可以在onCreate()或onRestoreI ...期间恢复状态。” - Scott Merritt

0

1
很不幸,它对我不起作用。我将我的对话框过程更改为通过onCreateDialog运行。我在onPause中使用dismissDialog(xxx),但当方向改变时,它仍然会在下拉列表打开时抛出错误。 - Bandzio

0
这是因为在调用dialog.dismiss()时,spinner上的onDetachedFromWindow()方法没有被调用。解决方法是创建一个简单的自定义Spinner类来公开此方法。
 public class DialogSpinner extends Spinner {

     public DialogSpinner(Context context, AttributeSet attrs) {
         super(context, attrs);
     }

     @Override
     public void onDetachedFromWindow() {
         super.onDetachedFromWindow();
     }
 }

现在onDetachedFromWindow()方法已经公开可用。然后在您的对话框类中覆盖onPause()方法。

 @Override
 public void onPause() {
     mYourSpinner.onDetachedFromWindow();
     super.onPause();
 }

这绝对是一个解决方法,但它似乎能够达到目的。


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