I know there's a ton of questions about memory leaks and orientation changes. I've spent hours looking and testing trying to figure out what exactly is going on. I've paired my app down to an activity and a dialog fragment. The dialog fragment disappears at orientation change. I know that and know how to handle it. I was just trying to get down to the smallest amount of code. When I tap the spinner to expand it, and then change orientation, I get a memory leak. Without it expanded, the dialog just disappears -- which is fine for now.
Can anyone see why I an expanded Spinner would give a memory leak on orientation change? Is it me or an android bug I have to work around?
Here's my app code:
testing Manifest.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.danlconsulting.testing"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="15" />
<application >
<activity
android:name=".MainActivity"
android:label="Main" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
MainActivity.java
package com.danlconsulting.testing;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
public class MainActivity extends FragmentActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
MyDialogFragment myDialog = new MyDialogFragment();
myDialog.show(getSupportFragmentManager(), "dlg");
}
}
MyDialogFragment.java
package com.danlconsulting.testing;
import android.os.Bundle;
import android.support.v4.app.DialogFragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
public class MyDialogFragment extends DialogFragment{
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//setRetainInstance(true);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(R.layout.dialog_fragment,container,false);
}
}
dialog_fragment.xml
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content" >
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minWidth="1000dp"
android:orientation="vertical" >
<Spinner
android:id="@+id/inputSpinner"
android:layout_width="match_parent"
android:layout_height="0dip"
android:layout_weight="0.07" />
</LinearLayout>
</ScrollView>
And activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:paddingTop="4dip"
android:paddingBottom="6dip"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
</LinearLayout>
EDIT: Of course I just saw another question that seems to be the same.
Spinner drop-down list and screen orientation change problem
But, I thought adding the android:configChanges="keyboardHidden|orientation" was not the desired solution??
My LOGCAT:
11-07 14:59:34.834: E/WindowManager(14250): Activity com.danlconsulting.testing.MainActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@40531e60 that was originally added here 11-07 14:59:34.834: E/WindowManager(14250): android.view.WindowLeaked: Activity com.danlconsulting.testing.MainActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@40531e60 that was originally added here 11-07 14:59:34.834: E/WindowManager(14250): at android.view.ViewRoot.(ViewRoot.java:273) 11-07 14:59:34.834: E/WindowManager(14250): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:174) 11-07 14:59:34.834: E/WindowManager(14250): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:117) 11-07 14:59:34.834: E/WindowManager(14250): at android.view.Window$LocalWindowManager.addView(Window.java:424) 11-07 14:59:34.834: E/WindowManager(14250): at android.app.Dialog.show(Dialog.java:241) 11-07 14:59:34.834: E/WindowManager(14250): at android.app.AlertDialog$Builder.show(AlertDialog.java:823) 11-07 14:59:34.834: E/WindowManager(14250): at android.widget.Spinner.performClick(Spinner.java:265) 11-07 14:59:34.834: E/WindowManager(14250): at android.view.View$PerformClick.run(View.java:9299) 11-07 14:59:34.834: E/WindowManager(14250): at android.os.Handler.handleCallback(Handler.java:587) 11-07 14:59:34.834: E/WindowManager(14250): at android.os.Handler.dispatchMessage(Handler.java:92) 11-07 14:59:34.834: E/WindowManager(14250): at android.os.Looper.loop(Looper.java:130) 11-07 14:59:34.834: E/WindowManager(14250): at android.app.ActivityThread.main(ActivityThread.java:3691) 11-07 14:59:34.834: E/WindowManager(14250): at java.lang.reflect.Method.invokeNative(Native Method) 11-07 14:59:34.834: E/WindowManager(14250): at java.lang.reflect.Method.invoke(Method.java:507) 11-07 14:59:34.834: E/WindowManager(14250): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:912) 11-07 14:59:34.834: E/WindowManager(14250): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:670) 11-07 14:59:34.834: E/WindowManager(14250): at dalvik.system.NativeStart.main(Native Method)