---
title: "Custom Layout"
canonical_url: "https://www.nutrient.io/guides/android/samples/custom-layout-kotlin/"
md_url: "https://www.nutrient.io/guides/android/samples/custom-layout-kotlin.md"
last_updated: "2026-05-15T19:10:04.916Z"
description: "Build a custom activity layout with PdfFragment, a navigation drawer, and next/previous buttons."
---

# Custom Layout

Build a custom activity layout with PdfFragment, a navigation drawer, and next/previous buttons.

[Get Started](https://www.nutrient.io/sdk/android/getting-started.md)

[All Samples](https://www.nutrient.io/guides/android/samples.md)

[Download](https://www.nutrient.io/guides/android/downloads.md)

[Launch Demo](https://www.nutrient.io/demo/)

---

```kotlin

/*
 *   Copyright © 2020-2026 PSPDFKit GmbH. All rights reserved.
 *
 *   The PSPDFKit Sample applications are licensed with a modified BSD license.
 *   Please see License for details. This notice may not be removed from this file.
 */

package com.pspdfkit.catalog.examples.kotlin

import android.content.Context
import android.net.Uri
import android.os.Bundle
import android.view.MenuItem
import android.view.View
import androidx.activity.OnBackPressedCallback
import androidx.annotation.UiThread
import androidx.core.view.GravityCompat
import androidx.drawerlayout.widget.DrawerLayout
import androidx.drawerlayout.widget.DrawerLayout.SimpleDrawerListener
import com.pspdfkit.catalog.R
import com.pspdfkit.catalog.SdkExample
import com.pspdfkit.catalog.tasks.ExtractAssetTask
import com.pspdfkit.catalog.utils.Utils
import com.pspdfkit.configuration.activity.PdfActivityConfiguration
import com.pspdfkit.configuration.activity.TabBarHidingMode
import com.pspdfkit.configuration.activity.ThumbnailBarMode
import com.pspdfkit.configuration.search.SearchType
import com.pspdfkit.document.PdfDocument
import com.pspdfkit.listeners.OnVisibilityChangedListener
import com.pspdfkit.ui.PdfActivity
import com.pspdfkit.ui.PdfActivityIntentBuilder
import com.pspdfkit.ui.PdfThumbnailGrid

/**
 * This example shows how to use a custom [PdfActivity] with a custom layout. In detail:
 *
 * - It subclasses the [PdfActivity] and uses a custom layout resource.
 * - It removes the thumbnail bar and adds two navigation buttons to the layouts ("Next" and "Previous").
 * - It puts the thumbnail grid into the right navigation drawer.
 */
class CustomLayoutExample(context: Context) :
    SdkExample(context, R.string.customLayoutExampleTitle, R.string.customLayoutExampleDescription) {
    override fun launchExample(context: Context, configuration: PdfActivityConfiguration.Builder) {
        // Define the custom layout of our activity inside the configuration.
        configuration.layout(R.layout.custom_pdf_activity)

        // The custom layout is missing some UI elements, in order to prevent the activity from
        // accessing them we have to deactivate them in the configuration.
        configuration.apply {
            // The custom layout has no thumbnail bar.
            setThumbnailBarMode(ThumbnailBarMode.THUMBNAIL_BAR_MODE_NONE)
            // The custom layout has no document editor.
            documentEditorEnabled(false)
            // The custom layout has no document title overlay.
            documentTitleOverlayEnabled(false)
            // The custom layout has no navigation buttons.
            navigationButtonsEnabled(false)
            // This example shows the thumbnail grid in a custom drawer layout.
            thumbnailGridEnabled(true)
            // Disable forms editing.
            formEditingEnabled(false)
            // The custom layout has no content editor.
            contentEditingEnabled(false)
            // Disable measurements
            setMeasurementToolsEnabled(false)
        }

        // Hide tab bar as it's not used by the custom layout.
        configuration.setTabBarHidingMode(TabBarHidingMode.HIDE)

        // We keep things simple, and use inline search for this example.
        configuration.apply {
            setSearchType(SearchType.INLINE)
        }

        // We use a custom utility class to extract the example document from the assets.
        ExtractAssetTask.extract(WELCOME_DOC, title, context) { documentFile ->
            // To start the `CustomLayoutActivity` create a launch intent using the builder.
            val intent =
                PdfActivityIntentBuilder.fromUri(context, Uri.fromFile(documentFile)).configuration(configuration.build()).activityClass(CustomLayoutActivity::class).build()
            context.startActivity(intent)
        }
    }
}

class CustomLayoutActivity : PdfActivity() {
    /**
     * Total number of pages in the current document.
     */
    private var documentPageCount = 0

    private lateinit var drawerLayout: DrawerLayout
    private lateinit var thumbnailGridView: PdfThumbnailGrid

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        // Get all required views for customization.
        drawerLayout = findViewById(R.id.drawerLayout)

        // Dynamically set the correct width of the thumbnail grid drawer.
        val thumbnailGridDrawer = findViewById<View>(R.id.thumbnailGridDrawer)
        Utils.setProperNavigationDrawerWidth(thumbnailGridDrawer)

        thumbnailGridView = findViewById(R.id.pspdf__activity_thumbnail_grid)

        // Register the thumbnail grid with the fragment, so it is notified of page changes.
        requirePdfFragment().addDocumentListener(thumbnailGridView)

        // Toggle drawer when thumbnail grid visibility changes.
        thumbnailGridView.addOnVisibilityChangedListener(
            object : OnVisibilityChangedListener {
                override fun onShow(view: View) {
                    drawerLayout.openDrawer(DRAWER_GRAVITY)
                }

                override fun onHide(view: View) {
                    drawerLayout.closeDrawer(DRAWER_GRAVITY)
                }
            },
        )

        // Ensure action bar and grid are visible when drawer is opened.
        drawerLayout.addDrawerListener(
            object : SimpleDrawerListener() {
                override fun onDrawerSlide(drawerView: View, slideOffset: Float) {}

                override fun onDrawerClosed(drawerView: View) {
                    thumbnailGridView.hide()
                }

                override fun onDrawerStateChanged(newState: Int) {
                    if (newState == DrawerLayout.STATE_DRAGGING) {
                        thumbnailGridView.show()
                    }
                }
            },
        )

        // Go to the tapped page, and close the thumbnail drawer after selecting a page.
        thumbnailGridView.setOnPageClickListener { _, pageIndex ->
            setPageIndex(pageIndex)
            toggleThumbnailGrid()
        }

        // Flip to the next page when clicking on the next page button.
        findViewById<View>(R.id.nextPageButton).setOnClickListener {
            val currentPage = pageIndex
            if (currentPage < documentPageCount - 1) pageIndex = currentPage + 1
        }
        // Flip to the previous page when clicking on the previous page button.
        findViewById<View>(R.id.previousPageButton).setOnClickListener {
            val currentPage = pageIndex
            if (currentPage > 0) pageIndex = currentPage - 1
        }

        // Handle back button presses using OnBackPressedDispatcher
        onBackPressedDispatcher.addCallback(
            this,
            object : OnBackPressedCallback(true) {
                override fun handleOnBackPressed() {
                    // First let parent handle back press
                    isEnabled = false
                    onBackPressedDispatcher.onBackPressed()
                    isEnabled = true
                    // Then hide thumbnail grid
                    hideThumbnailGrid()
                }
            },
        )
    }

    override fun onOptionsItemSelected(item: MenuItem): Boolean {
        when (item.itemId) {
            MENU_OPTION_THUMBNAIL_GRID -> {
                toggleThumbnailGrid()
                hidePSPDFViews()

                // Consume the event, preventing the default behavior.
                return true
            }

            MENU_OPTION_OUTLINE, MENU_OPTION_SEARCH -> {
                hideThumbnailGrid()
                // Don't consume the event here since we want to fallback to default action handling.
            }
        }
        return super.onOptionsItemSelected(item)
    }

    /**
     * Called as soon as the PDF document has been loaded.
     */
    @UiThread
    override fun onDocumentLoaded(document: PdfDocument) {
        super.onDocumentLoaded(document)

        // Retrieve the total number of pages in the document.
        documentPageCount = document.pageCount
    }

    private fun hidePSPDFViews() {
        pspdfKitViews.outlineView?.hide()
        pspdfKitViews.searchView?.hide()
    }

    private fun hideThumbnailGrid() {
        if (drawerLayout.isDrawerVisible(DRAWER_GRAVITY)) {
            drawerLayout.closeDrawer(DRAWER_GRAVITY)
        }
    }

    private fun toggleThumbnailGrid() {
        if (drawerLayout.isDrawerOpen(DRAWER_GRAVITY)) {
            thumbnailGridView.hide()
            drawerLayout.closeDrawer(DRAWER_GRAVITY)
        } else {
            thumbnailGridView.show()
            drawerLayout.openDrawer(DRAWER_GRAVITY)
        }
    }

    companion object {
        /** Gravity of the thumbnail grid drawer. */
        private const val DRAWER_GRAVITY = GravityCompat.END
    }
}

```

This code sample is an example that illustrates how to use our SDK. Please adapt it to your specific use case.

---

## Related pages

- [Application Policy](/guides/android/samples/application-policy-kotlin.md)
- [Custom Form Highlight Color](/guides/android/samples/custom-form-highlight-color-java.md)
- [Custom Page Templates](/guides/android/samples/custom-page-templates-java.md)
- [Digital Signature (Basic)](/guides/android/samples/digital-signature-basic-kotlin.md)
- [Disabled Annotation Property](/guides/android/samples/disabled-annotation-property-java.md)
- [Image Document](/guides/android/samples/image-document-kotlin.md)
- [Compose Image Document](/guides/android/samples/compose-image-document-kotlin.md)
- [Inline Multimedia](/guides/android/samples/inline-multimedia-kotlin.md)
- [JavaScript Form Filling](/guides/android/samples/javascript-form-filling-kotlin.md)
- [Overlay Visibility](/guides/android/samples/overlay-visibility-kotlin.md)
- [PdfFragment](/guides/android/samples/pdffragment-kotlin.md)
- [Reader View](/guides/android/samples/reader-view-kotlin.md)
- [Playground](/guides/android/samples/playground-kotlin.md)
- [JavaScript Calculator](/guides/android/samples/javascript-calculator-kotlin.md)
- [Text Field Suggestions](/guides/android/samples/text-field-suggestions-kotlin.md)
- [Thumbnail Bar Modes](/guides/android/samples/thumbnail-bar-modes-kotlin.md)
- [Signature Storage Database](/guides/android/samples/signature-storage-database-kotlin.md)
- [Selection Customization](/guides/android/samples/selection-customization-java.md)
- [Password Protected PDF](/guides/android/samples/password-protected-pdf-kotlin.md)
- [Scientific Paper](/guides/android/samples/scientific-paper-kotlin.md)
- [Try Instant](/guides/android/samples/try-instant-kotlin.md)
- [Merge Documents](/guides/android/samples/merge-documents-kotlin.md)
- [Annotation Rendering](/guides/android/samples/annotation-rendering-kotlin.md)
- [Custom Data Provider](/guides/android/samples/custom-data-provider-kotlin.md)
- [Annotations with Transparency](/guides/android/samples/annotations-with-transparency-kotlin.md)
- [Annotation Flags](/guides/android/samples/annotation-flags-kotlin.md)
- [AI Assistant (Multiple Documents, ViewPager)](/guides/android/samples/ai-assistant-multiple-documents-viewpager-kotlin.md)
- [Custom Sharing Menu](/guides/android/samples/custom-sharing-menu-java.md)
- [Add LTV to Existing Signature](/guides/android/samples/add-ltv-to-existing-signature-kotlin.md)
- [Custom Toolbar Grouping](/guides/android/samples/custom-toolbar-grouping-java.md)
- [Custom ActionBar Actions](/guides/android/samples/custom-actionbar-actions-kotlin.md)
- [Custom Activity Toolbars](/guides/android/samples/custom-activity-toolbars-java.md)
- [Custom Note Hinter](/guides/android/samples/custom-note-hinter-kotlin.md)
- [Custom Main Toolbar](/guides/android/samples/custom-main-toolbar-kotlin.md)
- [Annotation Configuration](/guides/android/samples/annotation-configuration-kotlin.md)
- [Annotation Selection Styling](/guides/android/samples/annotation-selection-styling-kotlin.md)
- [Custom Search UI (Compose)](/guides/android/samples/custom-search-ui-compose-kotlin.md)
- [Document Switcher](/guides/android/samples/document-switcher-java.md)
- [File Annotation Creation](/guides/android/samples/file-annotation-creation-kotlin.md)
- [Dynamic Pages on Scroll](/guides/android/samples/dynamic-pages-on-scroll-kotlin.md)
- [Custom Activity Form Editing](/guides/android/samples/custom-activity-form-editing-java.md)
- [Custom Stamp Annotations](/guides/android/samples/custom-stamp-annotations-java.md)
- [Custom Outline Provider](/guides/android/samples/custom-outline-provider-kotlin.md)
- [Compose Navigation](/guides/android/samples/compose-navigation-kotlin.md)
- [Fragment Runtime Configuration](/guides/android/samples/fragment-runtime-configuration-kotlin.md)
- [Annotation Overlay](/guides/android/samples/annotation-overlay-java.md)
- [Instant Document JSON](/guides/android/samples/instant-document-json-kotlin.md)
- [DocumentView Composable](/guides/android/samples/documentview-composable-kotlin.md)
- [Form Creation](/guides/android/samples/form-creation-kotlin.md)
- [Document Download](/guides/android/samples/document-download-kotlin.md)
- [JavaScript Actions](/guides/android/samples/javascript-actions-kotlin.md)
- [Instant JSON Attachment](/guides/android/samples/instant-json-attachment-kotlin.md)
- [Digital Signature (Manual)](/guides/android/samples/digital-signature-manual-kotlin.md)
- [Digital Signature (Third-Party)](/guides/android/samples/digital-signature-third-party-kotlin.md)
- [Inline Search](/guides/android/samples/inline-search-java.md)
- [Form Filling](/guides/android/samples/form-filling-kotlin.md)
- [Form Click Intercept (Compose)](/guides/android/samples/form-click-intercept-compose-kotlin.md)
- [Document Sharing](/guides/android/samples/document-sharing-java.md)
- [Custom Download Dialog](/guides/android/samples/custom-download-dialog-java.md)
- [Download Progress](/guides/android/samples/download-progress-kotlin.md)
- [Popup Toolbar Customization](/guides/android/samples/popup-toolbar-customization-kotlin.md)
- [Custom Sharing Dialog](/guides/android/samples/custom-sharing-dialog-java.md)
- [PDF from Image](/guides/android/samples/pdf-from-image-kotlin.md)
- [Digital Signature (Two-Step)](/guides/android/samples/digital-signature-two-step-kotlin.md)
- [Remote URL](/guides/android/samples/remote-url-kotlin.md)
- [PdfUiFragment](/guides/android/samples/pdfuifragment-kotlin.md)
- [Runtime Configuration](/guides/android/samples/runtime-configuration-kotlin.md)
- [Sound Extraction](/guides/android/samples/sound-extraction-kotlin.md)
- [Document from Canvas](/guides/android/samples/document-from-canvas-kotlin.md)
- [Tabbed Documents](/guides/android/samples/tabbed-documents-kotlin.md)
- [Watermarks](/guides/android/samples/watermarks-kotlin.md)
- [Programmatic Zoom](/guides/android/samples/programmatic-zoom-kotlin.md)
- [Signature Parcelize](/guides/android/samples/signature-parcelize-kotlin.md)
- [OCR](/guides/android/samples/ocr-kotlin.md)
- [Vertical Scrollbar](/guides/android/samples/vertical-scrollbar-java.md)
- [Split View](/guides/android/samples/split-view-java.md)
- [XFDF Import/Export](/guides/android/samples/xfdf-import-export-kotlin.md)
- [UI View Modes](/guides/android/samples/ui-view-modes-kotlin.md)
- [LTV Signature](/guides/android/samples/ltv-signature-kotlin.md)
- [Bookmark Highlighting](/guides/android/samples/bookmark-highlighting-kotlin.md)
- [Custom Annotation Inspector](/guides/android/samples/custom-annotation-inspector-java.md)
- [Annotation Sidebar](/guides/android/samples/annotation-sidebar-kotlin.md)
- [AI Assistant (Single Document)](/guides/android/samples/ai-assistant-single-document-kotlin.md)
- [AI Assistant (Multiple Documents, Compose)](/guides/android/samples/ai-assistant-multiple-documents-compose-kotlin.md)
- [Document Comparison](/guides/android/samples/document-comparison-kotlin.md)
- [Document Processing](/guides/android/samples/document-processing-kotlin.md)
- [Custom Annotation Creation Toolbar](/guides/android/samples/custom-annotation-creation-toolbar-java.md)
- [Custom Electronic Signature](/guides/android/samples/custom-electronic-signature-java.md)
- [E-Learning](/guides/android/samples/e-learning-kotlin.md)
- [Electronic + Digital Signing](/guides/android/samples/electronic-digital-signing-kotlin.md)
- [Generate PDF Report](/guides/android/samples/generate-pdf-report-kotlin.md)
- [Multimedia Annotations](/guides/android/samples/multimedia-annotations-kotlin.md)
- [Forms with JavaScript](/guides/android/samples/forms-with-javascript-kotlin.md)
- [External Document](/guides/android/samples/external-document-kotlin.md)
- [Overlay Views](/guides/android/samples/overlay-views-kotlin.md)
- [Kiosk Grid](/guides/android/samples/kiosk-grid-kotlin.md)
- [Search Indexing](/guides/android/samples/search-indexing-kotlin.md)
- [Annotation Creation](/guides/android/samples/annotation-creation-kotlin.md)
- [Filterable Thumbnail Grid](/guides/android/samples/filterable-thumbnail-grid-kotlin.md)
- [Tabbed Documents (Persistent)](/guides/android/samples/tabbed-documents-persistent-kotlin.md)
- [Measurement Tools](/guides/android/samples/measurement-tools-kotlin.md)
- [HTML-to-PDF Conversion](/guides/android/samples/html-to-pdf-conversion-kotlin.md)
- [AES Encrypted File](/guides/android/samples/aes-encrypted-file-java.md)
- [Construction Floor Plan](/guides/android/samples/construction-floor-plan-kotlin.md)
- [Hide and Reveal Areas](/guides/android/samples/hide-and-reveal-areas-kotlin.md)
- [Multiple Documents (Compose Pager)](/guides/android/samples/multiple-documents-compose-pager-kotlin.md)
- [Screen Reader](/guides/android/samples/screen-reader-java.md)
- [Custom Search UI (Views)](/guides/android/samples/custom-search-ui-views-java.md)

