diff --git a/android/build.gradle b/android/build.gradle index 7a5aa23b..ea3e2fd2 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -49,8 +49,9 @@ repositories { dependencies { implementation 'com.facebook.react:react-native:+' implementation 'androidx.appcompat:appcompat:1.1.0' - implementation 'androidx.coordinatorlayout:coordinatorlayout:1.0.0' - implementation 'com.google.android.material:material:1.0.0' + implementation 'androidx.fragment:fragment:1.2.1' + implementation 'androidx.coordinatorlayout:coordinatorlayout:1.1.0' + implementation 'com.google.android.material:material:1.1.0' } def configureReactNativePom(def pom) { diff --git a/android/src/main/java/com/swmansion/rnscreens/ScreenContainer.java b/android/src/main/java/com/swmansion/rnscreens/ScreenContainer.java index 9caad54c..ecc7804c 100644 --- a/android/src/main/java/com/swmansion/rnscreens/ScreenContainer.java +++ b/android/src/main/java/com/swmansion/rnscreens/ScreenContainer.java @@ -220,13 +220,6 @@ public class ScreenContainer extends ViewGroup { protected void onDetachedFromWindow() { super.onDetachedFromWindow(); mIsAttached = false; - - // fragment manager is destroyed so we can't do anything with it anymore - mFragmentManager = null; - // so we don't add the same screen twice after re-attach - removeAllViews(); - // after re-attach we'll update the screen and add views again - markUpdated(); } @Override diff --git a/android/src/main/java/com/swmansion/rnscreens/ScreenFragment.java b/android/src/main/java/com/swmansion/rnscreens/ScreenFragment.java index 4edac11f..569280af 100644 --- a/android/src/main/java/com/swmansion/rnscreens/ScreenFragment.java +++ b/android/src/main/java/com/swmansion/rnscreens/ScreenFragment.java @@ -5,6 +5,7 @@ import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.view.ViewParent; import androidx.annotation.Nullable; import androidx.fragment.app.Fragment; @@ -14,6 +15,17 @@ import com.facebook.react.uimanager.UIManagerModule; public class ScreenFragment extends Fragment { + protected static View recycleView(View view) { + // screen fragments reuse view instances instead of creating new ones. In order to reuse a given + // view it needs to be detached from the view hierarchy to allow the fragment to attach it back. + ViewParent parent = view.getParent(); + if (parent != null) { + ((ViewGroup) parent).endViewTransition(view); + ((ViewGroup) parent).removeView(view); + } + return view; + } + protected Screen mScreenView; public ScreenFragment() { @@ -30,7 +42,7 @@ public class ScreenFragment extends Fragment { public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { - return mScreenView; + return recycleView(mScreenView); } public Screen getScreen() { @@ -56,6 +68,12 @@ public class ScreenFragment extends Fragment { dispatchOnAppear(); } + @Override + public void onDestroyView() { + super.onDestroyView(); + recycleView(getView()); + } + @Override public void onDestroy() { super.onDestroy(); diff --git a/android/src/main/java/com/swmansion/rnscreens/ScreenStackFragment.java b/android/src/main/java/com/swmansion/rnscreens/ScreenStackFragment.java index 3b4e9e1b..c688afbc 100644 --- a/android/src/main/java/com/swmansion/rnscreens/ScreenStackFragment.java +++ b/android/src/main/java/com/swmansion/rnscreens/ScreenStackFragment.java @@ -143,7 +143,7 @@ public class ScreenStackFragment extends ScreenFragment { mScreenRootView = configureView(); } - return mScreenRootView; + return recycleView(mScreenRootView); } public boolean isDismissable() { diff --git a/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderConfig.java b/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderConfig.java index d03ca296..9e93000d 100644 --- a/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderConfig.java +++ b/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderConfig.java @@ -132,6 +132,11 @@ public class ScreenStackHeaderConfig extends ViewGroup { return; } + AppCompatActivity activity = (AppCompatActivity) getScreenFragment().getActivity(); + if (activity == null) { + return; + } + if (mIsHidden) { if (mToolbar.getParent() != null) { getScreenFragment().removeToolbar(); @@ -143,7 +148,6 @@ public class ScreenStackHeaderConfig extends ViewGroup { getScreenFragment().setToolbar(mToolbar); } - AppCompatActivity activity = (AppCompatActivity) getScreenFragment().getActivity(); activity.setSupportActionBar(mToolbar); ActionBar actionBar = activity.getSupportActionBar();