Spinner drop-down list and screen orientation problem

I have a problem with a spinner dropdown and orientation change.

In my activity I show a dialogue in which I have two spinners. When the dialog is displayed to the user, and the user changes the screen orientation, everything is fine - in my onPause I just simply turn off the dialog.

If the user clicks on the counter, a drop-down list is displayed to the user before changing the orientation. But I encountered an error when the user does not select anything from the drop-down list and simply leaves the list extended until the orientation changes.

I tried a lot to solve this problem (i.e. spinner.setSelection(0) in onSaveInstanceState() , etc.). My idea is to close the drop-down list from the code when the user does not select the element and the orientation changes.

Error: 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) 

In addition, this error appears:

 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) 

EDIT

DECISION:

Finally, I found the cause of the error * & # $%. In the manifest of my activity, I have android: configChanges = "orientation", when I change it to android: configChanges = "keyboardHidden | orientation" the problem is gone!

thanks 4 will help!

+4
source share
3 answers

I had an idea to prevent orientation changes when a dialog with a counter is displayed, but found that there is no reliable way to do this . The best solution I have found is to replace the spinner with a button .

+1
source

The answer is: the application crashes when the warning dialog box is open, and the phone (emulator) changes orientation . Look at the answer from MegaMind to help solve this problem.

0
source

This is because onDetachedFromWindow () is not called on the spinner when calling dialog.dismiss (). The solution to this is to create a simple custom spinner class that provides this method.

  public class DialogSpinner extends Spinner { public DialogSpinner(Context context, AttributeSet attrs) { super(context, attrs); } @Override public void onDetachedFromWindow() { super.onDetachedFromWindow(); } } 

The onDetachedFromWindow () method is now public. Then, in your dialog class, override the onPause () method.

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

This is definitely a workaround, but it seems like a trick.

0
source

Source: https://habr.com/ru/post/1342829/


All Articles