@@ -77,6 +77,9 @@ public class PdfView extends FrameLayout {
7777
7878 private static final String FILE_SCHEME = "file:///" ;
7979
80+ /** Key to use when setting the id argument of PdfFragments created by this PdfView. */
81+ private static final String ARG_ROOT_ID = "root_id" ;
82+
8083 private FragmentManager fragmentManager ;
8184 private EventDispatcher eventDispatcher ;
8285 private String fragmentTag ;
@@ -102,6 +105,9 @@ public class PdfView extends FrameLayout {
102105 @ Nullable
103106 private PdfTextSelectionPopupToolbar textSelectionPopupToolbar ;
104107
108+ /** An internal id we generate so we can track if fragments found belong to this specific PdfView instance. */
109+ private int internalId ;
110+
105111 public PdfView (@ NonNull Context context ) {
106112 super (context );
107113 init ();
@@ -158,6 +164,9 @@ public void doFrame(long frameTimeNanos) {
158164
159165 // Set a default configuration.
160166 configuration = new PdfActivityConfiguration .Builder (getContext ()).build ();
167+
168+ // Generate an id to set on all fragments created by the PdfView.
169+ internalId = View .generateViewId ();
161170 }
162171
163172 public void inject (FragmentManager fragmentManager , EventDispatcher eventDispatcher ) {
@@ -239,8 +248,20 @@ public void setMenuItemGroupingRule(@NonNull MenuItemGroupingRule groupingRule)
239248 private void setupFragment () {
240249 if (fragmentTag != null && configuration != null && document != null ) {
241250 PdfFragment pdfFragment = (PdfFragment ) fragmentManager .findFragmentByTag (fragmentTag );
251+ if (pdfFragment != null &&
252+ (pdfFragment .getArguments () == null ||
253+ pdfFragment .getArguments ().getInt (ARG_ROOT_ID ) != internalId )) {
254+ // This is an orphaned fragment probably from a reload, get rid of it.
255+ fragmentManager .beginTransaction ()
256+ .remove (pdfFragment )
257+ .commitNow ();
258+ pdfFragment = null ;
259+ }
260+
242261 if (pdfFragment == null ) {
243262 pdfFragment = PdfFragment .newInstance (document , this .configuration .getConfiguration ());
263+ // We put our internal id so we can track if this fragment belongs to us, used to handle orphaned fragments after hot reloads.
264+ pdfFragment .getArguments ().putInt (ARG_ROOT_ID , internalId );
244265 prepareFragment (pdfFragment );
245266 } else {
246267 View fragmentView = pdfFragment .getView ();
0 commit comments