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

Android: Ensure proper cleanup of the fragment
This commit is contained in:
Thaddeus Crews 2025-09-28 10:07:48 -05:00
commit ef4863ab97
No known key found for this signature in database
GPG key ID: 8C6E5FEB5FC03CCC
2 changed files with 25 additions and 1 deletions

View file

@ -98,7 +98,16 @@ abstract class GodotActivity : FragmentActivity(), GodotHost {
} else {
Log.v(TAG, "Creating new Godot fragment instance.")
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()
}
}

View file

@ -126,6 +126,11 @@ public class GodotFragment extends Fragment implements IDownloaderClient, GodotH
@Override
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();
parentHost = null;
}
@ -233,11 +238,21 @@ public class GodotFragment extends Fragment implements IDownloaderClient, GodotH
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;
}
@Override
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);
super.onDestroy();
}