Extending PdfActivity with custom activities

Displaying documents using the PdfActivity is sufficient in most cases. Nonetheless, there are situations where customizations beyond pure styling are necessary. For more flexibility, you can extend the PdfActivity and implement your own custom activities.

Since a PdfActivity and any activities deriving from it need special intent data (document sources, passwords, configuration, etc.) you need to create a special launch Intent using the PdfActivityIntentBuilder that will carry all of this information. The builder allows you to set your activity class using its #activity method. For a comprehensive example of what is possible with customization, take a look at the CustomLayoutExample or the CustomActionsExample inside the Catalog app.

Creating your activity

The first step for implementing a custom activity is to subclass the PdfActivity. Note that your custom activity does not need to override #onCreate, and it does not need to define or inflate a layout. The layout will be set up by the PdfActivity parent class and can be using the PdfActivityConfiguration.Builder#layout when launching the activity:

class MyCustomActivity : PdfActivity() {
override fun onPrepareOptionsMenu(menu: Menu): Boolean {
var handled = super.onPrepareOptionsMenu(menu)
// Custom action bar menu creation.
return handled
}
override fun onDocumentLoaded(document: PdfDocument) {
// Document is ready to use.
}
override fun onDocumentLoadFailed(exception: Throwable) {
// Add your fancy error handling here.
}
}

Next, you need to add this activity to your AndroidManifest.xml so you can launch it. You can also define the android:theme property to set a custom theme:

<activity
android:name="com.pspdfkit.example.MyCustomActivity"
android:label="@string/title_activity_custom"
android:theme="@style/MyApp.Theme" />

To launch MyCustomActivity, first create a PdfActivityConfiguration, then create a launching intent using the PdfActivityIntentBuilder, and finally call Activity#startActivity(opens in a new tab) with the intent you created:

val config = PdfActivityConfiguration.Builder(context).build()
val intent = PdfActivityIntentBuilder.fromUri(context, uri)
.configuration(config)
.activity(MyCustomActivity::class.java)
.build()
// Start the `MyCustomActivity` like any other activity.
context.startActivity(intent)

Custom activity Layouts

By default, PdfActivity uses the R.layout.pspdf__pdf_activity as its layout file. Have a look at that file to see all the views Nutrient uses. You can use the file as a template for your custom layout. To specify the layout, provide its ID to the PdfActivityConfiguration.Builder#layout method. Usually, it also makes sense to subclass the PdfActivity so it can make use of the custom layout and the views you may add:

val config = PdfActivityConfiguration.Builder(context)
.layout(R.layout.my_custom_layout)
.build()

Required views

The PdfActivity expects several views to be present in the selected layout file. If any of the following views is missing, Nutrient will throw an InvalidLayoutException:

View IDDescription
@id/pspdf__toolbar_coordinatorA ToolbarCoordinatorLayout for managing and laying out the main toolbar (action bar) and contextual toolbars.
@id/pspdf__toolbar_mainandroidx.appcompat.widget.Toolbar(opens in a new tab) serves as the activity’s action bar. This has to be wrapped inside the toolbar coordinator view.
@id/pspdf__inspector_coordinatorPropertyInspectorCoordinatorLayout for managing and laying out the PropertyInspector views.
@id/pspdf__activity_fragment_containerViewGroup(opens in a new tab) or any subclass. The activity will use this to inject the PdfFragment.
@id/pspdf__activity_form_editing_barFormEditingBar serves as the helper toolbar for filling out interactive forms. This is not required when form editing is disabled.

Optional views

In addition to the mandatory views, the layout may define several optional views. These views may be removed from the original layout. However, if this is done, they need to be deactivated explicitly using the PdfActivityConfiguration.Builder:

View IDDescription
@id/pspdf__activity_thumbnail_barThe PdfThumbnailBar for displaying a horizontal list of thumbnails that show the current page.
@id/pspdf__activity_page_overlayA TextView(opens in a new tab) for displaying the current page and total page count (e.g. Page 4 of 22).
@id/pspdf__activity_thumbnail_gridThe PdfThumbnailGrid is a scrollable fullscreen grid of all the pages.
@id/pspdf__activity_search_view_modularA PdfSearchViewModular for displaying a search box and a list of search results.
@id/pspdf__activity_outline_viewThe PdfOutlineView, which displays the document outline (table of contents) and a list of all annotations on the document.
@id/pspdf__navigate_back and @id/pspdf__navigate_forwardCardView(opens in a new tab)s that display the buttons for navigating back and forward.
@id/pspdf__activity_title_overlayA TextView(opens in a new tab) for displaying the current document’s title.
@id/pspdf__activity_tab_barThe PdfTabBar for displaying a horizontal list of document tabs.