Skip to content

Commit f741971

Browse files
author
irgendeinich
committed
Fix hot reload breaking the PdfView
1 parent 1e501a8 commit f741971

File tree

1 file changed

+19
-0
lines changed

1 file changed

+19
-0
lines changed

android/src/main/java/com/pspdfkit/views/PdfView.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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,18 @@ 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 && pdfFragment.getArguments().getInt(ARG_ROOT_ID) != internalId) {
252+
// This is an orphaned fragment probably from a reload, get rid of it.
253+
fragmentManager.beginTransaction()
254+
.remove(pdfFragment)
255+
.commitNow();
256+
pdfFragment = null;
257+
}
258+
242259
if (pdfFragment == null) {
243260
pdfFragment = PdfFragment.newInstance(document, this.configuration.getConfiguration());
261+
// We put our internal id so we can track if this fragment belongs to us, used to handle orphaned fragments after hot reloads.
262+
pdfFragment.getArguments().putInt(ARG_ROOT_ID, internalId);
244263
prepareFragment(pdfFragment);
245264
} else {
246265
View fragmentView = pdfFragment.getView();

0 commit comments

Comments
 (0)