---
title: "Custom Annotation Creation Toolbar"
canonical_url: "https://www.nutrient.io/guides/android/samples/custom-annotation-creation-toolbar-java/"
md_url: "https://www.nutrient.io/guides/android/samples/custom-annotation-creation-toolbar-java.md"
last_updated: "2026-05-15T19:10:04.916Z"
description: "Add custom items to the annotation creation toolbar bound to specific tools and variants."
---

# Custom Annotation Creation Toolbar

Add custom items to the annotation creation toolbar bound to specific tools and variants.

[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/)

---

```java

/*
 *   Copyright © 2019-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.java;

import static com.pspdfkit.catalog.tasks.ExtractAssetTask.extract;

import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Bundle;
import android.util.Pair;
import android.util.SparseArray;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.content.res.AppCompatResources;
import com.pspdfkit.annotations.configuration.AnnotationConfigurationRegistry;
import com.pspdfkit.annotations.configuration.LineAnnotationConfiguration;
import com.pspdfkit.catalog.R;
import com.pspdfkit.catalog.SdkExample;
import com.pspdfkit.configuration.activity.PdfActivityConfiguration;
import com.pspdfkit.document.PdfDocument;
import com.pspdfkit.ui.PdfActivity;
import com.pspdfkit.ui.PdfActivityIntentBuilder;
import com.pspdfkit.ui.PdfFragment;
import com.pspdfkit.ui.special_mode.controller.AnnotationTool;
import com.pspdfkit.ui.special_mode.controller.AnnotationToolVariant;
import com.pspdfkit.ui.toolbar.AnnotationToolbar;
import com.pspdfkit.ui.toolbar.ContextualToolbar;
import com.pspdfkit.ui.toolbar.ContextualToolbarMenuItem;
import com.pspdfkit.ui.toolbar.ToolbarCoordinatorLayout;
import com.pspdfkit.ui.toolbar.grouping.presets.MenuItem;
import com.pspdfkit.ui.toolbar.grouping.presets.PresetMenuItemGroupingRule;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * Example showing how to use custom annotation creation toolbar item and bind it to the annotation
 * tool and variant.
 */
public class CustomAnnotationCreationToolbarExample extends SdkExample {

    public CustomAnnotationCreationToolbarExample(@NonNull Context context) {
        super(
                context,
                R.string.customAnnotationCreationToolbarExampleTitle,
                R.string.customAnnotationCreationToolbarExampleDescription);
    }

    @Override
    public void launchExample(@NonNull Context context, @NonNull PdfActivityConfiguration.Builder configuration) {
        // We use a custom utility class to extract the example document from the assets.
        extract(WELCOME_DOC, getTitle(), context, documentFile -> {
            final Intent intent = PdfActivityIntentBuilder.fromUri(context, Uri.fromFile(documentFile)).configuration(configuration.build()).activityClass(CustomAnnotationCreationToolbarActivity.class).build();
            context.startActivity(intent);
        });
    }

    /**
     * This example shows how to manipulate annotation creation toolbar to add your own annotation tool
     * items. In this example we add three line annotation tools, each of them for drawing lines of
     * different colors.
     */
    public static class CustomAnnotationCreationToolbarActivity extends PdfActivity
            implements ToolbarCoordinatorLayout.OnContextualToolbarLifecycleListener,
                    AnnotationToolbar.ItemToAnnotationToolMapper {

        // Variants of the line tool that we will add.
        private static final String VARIANT_NAME_LINE_BLUE = "blue_line";
        private static final String VARIANT_NAME_LINE_RED = "red_line";
        private static final String VARIANT_NAME_LINE_YELLOW = "yellow_line";

        // Icons for custom toolbar items.
        @Nullable
        private Drawable blueLineIcon;

        @Nullable
        private Drawable redLineIcon;

        @Nullable
        private Drawable yellowLineIcon;

        @Override
        public void onCreate(final Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);

            // First we set the listener for the toolbar lifecycle changes so we
            // can observe when the toolbar is being prepared, shown or dismissed
            // inside the activity's UI.
            setOnContextualToolbarLifecycleListener(this);

            blueLineIcon = AppCompatResources.getDrawable(this, com.pspdfkit.R.drawable.pspdf__ic_line);
            // The red line uses a customized colored drawable. So tinting must be disabled.
            redLineIcon = AppCompatResources.getDrawable(this, R.drawable.ic_line_red);
            yellowLineIcon = AppCompatResources.getDrawable(this, com.pspdfkit.R.drawable.pspdf__ic_line);
        }

        @Override
        public void onDocumentLoaded(@NonNull final PdfDocument document) {
            super.onDocumentLoaded(document);

            final PdfFragment pdfFragment = getPdfFragment();
            if (pdfFragment!= null) {
                // Here we set editing defaults for the items we're gonna create.
                final AnnotationConfigurationRegistry annotationConfiguration =
                        pdfFragment.getAnnotationConfiguration();

                // Blue line configuration.
                annotationConfiguration.put(
                        AnnotationTool.LINE,
                        AnnotationToolVariant.fromName(VARIANT_NAME_LINE_BLUE),
                        LineAnnotationConfiguration.builder(this) // Use preset configuration for creating lines..setDefaultColor(Color.BLUE) // Use blue as a default color..setAvailableColors(Collections.singletonList(Color.BLUE)) // Only allow blue to be set..setForceDefaults(true) // Always force these defaults..setCustomColorPickerEnabled(false).build());

                // Red line configuration.
                annotationConfiguration.put(
                        AnnotationTool.LINE,
                        AnnotationToolVariant.fromName(VARIANT_NAME_LINE_RED),
                        LineAnnotationConfiguration.builder(this) // Use preset configuration for creating lines..setDefaultColor(Color.RED) // Use red as a default color..setAvailableColors(Collections.singletonList(Color.RED)) // Only allow red to be set..setForceDefaults(true) // Always force these defaults..setCustomColorPickerEnabled(false).build());

                // Yellow line configuration.
                annotationConfiguration.put(
                        AnnotationTool.LINE,
                        AnnotationToolVariant.fromName(VARIANT_NAME_LINE_YELLOW),
                        LineAnnotationConfiguration.builder(this) // Use preset configuration for creating lines..setDefaultColor(Color.YELLOW) // Use yellow as a default color..setAvailableColors(
                                        Collections.singletonList(Color.YELLOW)) // Only allow yellow to be set..setForceDefaults(true) // Always force these defaults..setCustomColorPickerEnabled(false).build());
            }
        }

        @Override // ToolbarCoordinatorLayout.OnContextualToolbarLifecycleListener
        public void onPrepareContextualToolbar(@NonNull final ContextualToolbar toolbar) {
            if (toolbar instanceof AnnotationToolbar annotationToolbar) {
                // Register this class as a mapper (see implemented methods below).
                annotationToolbar.setItemToAnnotationToolMapper(this);

                // Register grouping rule to tell toolbar how to group menu items.
                annotationToolbar.setMenuItemGroupingRule(new CustomAnnotationCreationToolbarGroupingRule(this));

                final List<ContextualToolbarMenuItem> customMenuItems = new ArrayList<>();

                if (blueLineIcon!= null) {
                    final ContextualToolbarMenuItem blueLineItem = ContextualToolbarMenuItem.createSingleItem(
                            this,
                            R.id.line_blue,
                            blueLineIcon,
                            "Line: Blue",
                            Color.GRAY,
                            Color.BLUE,
                            ContextualToolbarMenuItem.Position.START,
                            true);
                    customMenuItems.add(blueLineItem);
                }

                if (redLineIcon!= null) {
                    final ContextualToolbarMenuItem redLineItem = ContextualToolbarMenuItem.createSingleItem(
                            this,
                            R.id.line_red,
                            redLineIcon,
                            "Line: Red",
                            Color.WHITE,
                            Color.BLUE,
                            ContextualToolbarMenuItem.Position.START,
                            true);
                    // Disabling tinting as the red line drawable
                    // is a colored one.
                    redLineItem.setTintingEnabled(false);
                    customMenuItems.add(redLineItem);
                }

                if (yellowLineIcon!= null) {
                    final ContextualToolbarMenuItem yellowLineItem = ContextualToolbarMenuItem.createSingleItem(
                            this,
                            R.id.line_yellow,
                            yellowLineIcon,
                            "Line: Yellow",
                            Color.GRAY,
                            Color.BLUE,
                            ContextualToolbarMenuItem.Position.START,
                            true);
                    customMenuItems.add(yellowLineItem);
                }

                // Before we pass custom items, we need to include our default ones as well.
                customMenuItems.addAll(annotationToolbar.getMenuItems());
                annotationToolbar.setMenuItems(customMenuItems);
            }
        }

        @Override // ToolbarCoordinatorLayout.OnContextualToolbarLifecycleListener
        public void onDisplayContextualToolbar(@NonNull final ContextualToolbar toolbar) {}

        @Override // ToolbarCoordinatorLayout.OnContextualToolbarLifecycleListener
        public void onRemoveContextualToolbar(@NonNull final ContextualToolbar toolbar) {}

        @NonNull
        @Override // AnnotationToolbar.ItemToAnnotationToolMapper
        public SparseArray<Pair<AnnotationTool, AnnotationToolVariant>> getItemToAnnotationToolMapping() {
            // We need to add mappings to let toolbar know which item should handle which tool/variant.
            final SparseArray<Pair<AnnotationTool, AnnotationToolVariant>> itemToAnnotationToolMapping =
                    new SparseArray<>();
            itemToAnnotationToolMapping.put(
                    R.id.line_blue,
                    new Pair<>(AnnotationTool.LINE, AnnotationToolVariant.fromName(VARIANT_NAME_LINE_BLUE)));
            itemToAnnotationToolMapping.put(
                    R.id.line_red,
                    new Pair<>(AnnotationTool.LINE, AnnotationToolVariant.fromName(VARIANT_NAME_LINE_RED)));
            itemToAnnotationToolMapping.put(
                    R.id.line_yellow,
                    new Pair<>(AnnotationTool.LINE, AnnotationToolVariant.fromName(VARIANT_NAME_LINE_YELLOW)));
            return itemToAnnotationToolMapping;
        }

        @Override // AnnotationToolbar.ItemToAnnotationToolMapper
        public boolean isStyleIndicatorCircleEnabled(final int itemId) {
            // We want to show style indicators for all our custom items and not show it for all the
            // default ones.
            return getItemToAnnotationToolMapping().get(itemId)!= null;
        }

        /**
         * Class that implements the {@link PresetMenuItemGroupingRule}, used to tell the toolbar how to
         * group menu items in the toolbar.
         *
         * @see com.pspdfkit.catalog.ui.CustomAnnotationCreationToolbarGroupingRule for more details.
         */
        private static class CustomAnnotationCreationToolbarGroupingRule extends PresetMenuItemGroupingRule {

            private final List<MenuItem> CUSTOM_GROUPING = new ArrayList<>(4);

            CustomAnnotationCreationToolbarGroupingRule(@NonNull final Context context) {
                super(context);

                // This adds our default markup items under out default markup group item.
                CUSTOM_GROUPING.add(new MenuItem(com.pspdfkit.R.id.pspdf__annotation_toolbar_group_markup, new int[] {
                    com.pspdfkit.R.id.pspdf__annotation_toolbar_item_highlight,
                    com.pspdfkit.R.id.pspdf__annotation_toolbar_item_squiggly,
                    com.pspdfkit.R.id.pspdf__annotation_toolbar_item_strikeout,
                    com.pspdfkit.R.id.pspdf__annotation_toolbar_item_underline,
                    com.pspdfkit.R.id.pspdf__annotation_toolbar_item_line
                }));

                // This adds line items under our group item ('writing' in this case). You can also use
                // your own
                // but then you need to add them to the menu items.
                CUSTOM_GROUPING.add(new MenuItem(
                        com.pspdfkit.R.id.pspdf__annotation_toolbar_group_writing,
                        new int[] {R.id.line_blue, R.id.line_red, R.id.line_yellow}));

                // Some standalone item from the default framework implementation.
                CUSTOM_GROUPING.add(new MenuItem(com.pspdfkit.R.id.pspdf__annotation_toolbar_item_ink_highlighter));

                // To access the property inspector, the color picker item needs to be added as well.
                CUSTOM_GROUPING.add(new MenuItem(com.pspdfkit.R.id.pspdf__annotation_toolbar_item_picker));
            }

            @NonNull
            @Override
            public List<MenuItem> getGroupPreset(final int capacity, final int itemsCount) {
                // Capacity shouldn't be less than 4. If that is the case, return empty list.
                if (capacity < ContextualToolbar.MIN_TOOLBAR_CAPACITY) return new ArrayList<>(capacity);

                // Return our custom groupings for all other capacities.
                return CUSTOM_GROUPING;
            }

            @Override
            public boolean areGeneratedGroupItemsSelectable() {
                return true;
            }
        }
    }
}

```

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 Layout](/guides/android/samples/custom-layout-kotlin.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 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)

