Browse Source

Merge pull request #109764 from ydeltastar/android-fragment-fix

Android: Ensure proper cleanup of the fragment
Thaddeus Crews 2 weeks ago
parent
commit
ef4863ab97

+ 10 - 1
platform/android/java/lib/src/org/godotengine/godot/GodotActivity.kt

@@ -98,7 +98,16 @@ abstract class GodotActivity : FragmentActivity(), GodotHost {
 		} else {
 		} else {
 			Log.v(TAG, "Creating new Godot fragment instance.")
 			Log.v(TAG, "Creating new Godot fragment instance.")
 			godotFragment = initGodotInstance()
 			godotFragment = initGodotInstance()
-			supportFragmentManager.beginTransaction().replace(R.id.godot_fragment_container, godotFragment!!).setPrimaryNavigationFragment(godotFragment).commitNowAllowingStateLoss()
+
+			val transaction = supportFragmentManager.beginTransaction()
+			if (currentFragment != null) {
+				Log.v(TAG, "Removing existing fragment before replacement.")
+				transaction.remove(currentFragment)
+			}
+
+			transaction.replace(R.id.godot_fragment_container, godotFragment!!)
+				.setPrimaryNavigationFragment(godotFragment)
+				.commitNowAllowingStateLoss()
 		}
 		}
 	}
 	}
 
 

+ 15 - 0
platform/android/java/lib/src/org/godotengine/godot/GodotFragment.java

@@ -126,6 +126,11 @@ public class GodotFragment extends Fragment implements IDownloaderClient, GodotH
 
 
 	@Override
 	@Override
 	public void onDetach() {
 	public void onDetach() {
+		if (godotContainerLayout != null && godotContainerLayout.getParent() != null) {
+			Log.d(TAG, "Cleaning up Godot container layout during detach.");
+			((ViewGroup)godotContainerLayout.getParent()).removeView(godotContainerLayout);
+		}
+
 		super.onDetach();
 		super.onDetach();
 		parentHost = null;
 		parentHost = null;
 	}
 	}
@@ -233,11 +238,21 @@ public class GodotFragment extends Fragment implements IDownloaderClient, GodotH
 			return downloadingExpansionView;
 			return downloadingExpansionView;
 		}
 		}
 
 
+		if (godotContainerLayout != null && godotContainerLayout.getParent() != null) {
+			Log.w(TAG, "Godot container layout already has a parent, removing it.");
+			((ViewGroup)godotContainerLayout.getParent()).removeView(godotContainerLayout);
+		}
+
 		return godotContainerLayout;
 		return godotContainerLayout;
 	}
 	}
 
 
 	@Override
 	@Override
 	public void onDestroy() {
 	public void onDestroy() {
+		if (godotContainerLayout != null && godotContainerLayout.getParent() != null) {
+			Log.w(TAG, "Removing Godot container layout from parent during destruction.");
+			((ViewGroup)godotContainerLayout.getParent()).removeView(godotContainerLayout);
+		}
+
 		godot.onDestroy(this);
 		godot.onDestroy(this);
 		super.onDestroy();
 		super.onDestroy();
 	}
 	}