---
title: "Custom Annotation Inspector"
canonical_url: "https://www.nutrient.io/guides/android/samples/custom-annotation-inspector-java/"
md_url: "https://www.nutrient.io/guides/android/samples/custom-annotation-inspector-java.md"
last_updated: "2026-05-15T19:10:04.916Z"
description: "Customize the annotation property inspector with custom property options."
---

# Custom Annotation Inspector

Customize the annotation property inspector with custom property options.

[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 © 2014-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.utils.Utils.dpToPx;

import android.app.AlertDialog;
import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.widget.LinearLayout;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.pspdfkit.annotations.Annotation;
import com.pspdfkit.annotations.AnnotationType;
import com.pspdfkit.annotations.defaults.AnnotationPreferencesManager;
import com.pspdfkit.catalog.R;
import com.pspdfkit.catalog.SdkExample;
import com.pspdfkit.catalog.tasks.ExtractAssetTask;
import com.pspdfkit.configuration.activity.PdfActivityConfiguration;
import com.pspdfkit.ui.PdfActivity;
import com.pspdfkit.ui.PdfActivityIntentBuilder;
import com.pspdfkit.ui.PdfFragment;
import com.pspdfkit.ui.inspector.PropertyInspector;
import com.pspdfkit.ui.inspector.PropertyInspectorView;
import com.pspdfkit.ui.inspector.annotation.AnnotatingInspectorController;
import com.pspdfkit.ui.inspector.annotation.DefaultAnnotationEditingInspectorController;
import com.pspdfkit.ui.inspector.views.ColorPickerInspectorDetailView;
import com.pspdfkit.ui.inspector.views.PropertyInspectorDividerDecoration;
import com.pspdfkit.ui.inspector.views.SliderPickerInspectorView;
import com.pspdfkit.ui.special_mode.controller.AnnotatingController;
import com.pspdfkit.ui.special_mode.controller.AnnotationInspectorController;
import com.pspdfkit.ui.special_mode.controller.AnnotationTool;
import com.pspdfkit.ui.special_mode.controller.AnnotationToolVariant;
import java.util.ArrayList;
import java.util.List;

/** Showcases how to create custom annotation inspector from scratch. */
public class CustomAnnotationInspectorExample extends SdkExample {

    public CustomAnnotationInspectorExample(@NonNull final Context context) {
        super(
                context,
                R.string.annotationCustomInspectorExampleTitle,
                R.string.annotationCustomInspectorExampleDescription);
    }

    @Override
    public void launchExample(
            @NonNull final Context context, @NonNull final PdfActivityConfiguration.Builder configuration) {
        // Extract the document from the assets. The launched activity will add annotations to that
        // document.
        ExtractAssetTask.extract(WELCOME_DOC, getTitle(), context, documentFile -> {
            final Intent intent = PdfActivityIntentBuilder.fromUri(context, Uri.fromFile(documentFile)).configuration(configuration.build()).activityClass(CustomAnnotationInspectorActivity.class).build();

            // Start the CustomAnnotationInspectorActivity for the extracted document.
            context.startActivity(intent);
        });
    }

    /**
     * Shows how to implement custom {@link AnnotationInspectorController} and how to add custom views
     * to existing annotation inspector.
     */
    public static class CustomAnnotationInspectorActivity extends PdfActivity {

        /** Colors that are going to be available in annotation creation inspector's color picker. */
        private static final List<Integer> CREATION_PICKER_COLORS = List.of(
                Color.rgb(244, 67, 54), // RED
                Color.rgb(139, 195, 74), // LIGHT GREEN
                Color.rgb(33, 150, 243), // BLUE
                Color.rgb(252, 237, 140), // YELLOW
                Color.rgb(233, 30, 99), // PINK

                // GRAYSCALE below
                Color.rgb(255, 255, 255),
                Color.rgb(224, 224, 224),
                Color.rgb(158, 158, 158),
                Color.rgb(66, 66, 66),
                Color.rgb(0, 0, 0));

        /** Colors that are going to be displayed in annotation editing inspector's root layout. */
        private static final List<Integer> EDITING_PICKER_COLORS = List.of(
                Color.rgb(244, 67, 54), // RED
                Color.rgb(139, 195, 74), // LIGHT GREEN
                Color.rgb(33, 150, 243), // BLUE
                Color.rgb(252, 237, 140), // YELLOW
                Color.rgb(233, 30, 99)); // PINK

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

            // Create custom annotation creation inspector displaying custom UI in modal dialog.
            CustomAnnotationCreationInspector customAnnotationCreationInspector =
                    new CustomAnnotationCreationInspector();

            // Add custom color picker view to annotation editing inspector.
            DefaultAnnotationEditingInspectorController customAnnotationEditingInspector =
                    new DefaultAnnotationEditingInspectorController(this, getPropertyInspectorCoordinator()) {

                        @Override
                        public void onPreparePropertyInspector(@NonNull PropertyInspector inspector) {
                            // Prepare standard property inspector.
                            super.onPreparePropertyInspector(inspector);

                            // Add decoration to show dividers between inspector items.
                            inspector.addItemDecoration(new PropertyInspectorDividerDecoration(getContext()));

                            // Add custom color picker for the ink annotation.
                            if (getAnnotationEditingController() == null) return;
                            final List<Annotation> annotations =
                                    getAnnotationEditingController().getCurrentlySelectedAnnotations();
                            if (annotations.isEmpty()) return;

                            for (Annotation annotation : annotations) {
                                if (annotation.getType()!= AnnotationType.INK) return;
                            }

                            final var colorPickerInspectorDetailView = getColorPickerInspectorDetailView(annotations);
                            inspector.addInspectorView(colorPickerInspectorDetailView);
                        }

                        private @NonNull ColorPickerInspectorDetailView getColorPickerInspectorDetailView(
                                List<Annotation> annotations) {
                            final var detailView = new ColorPickerInspectorDetailView(
                                    getContext(), EDITING_PICKER_COLORS, EDITING_PICKER_COLORS.get(0), false);
                            detailView.setShowSelectionIndicator(false);

                            detailView.setOnColorPickedListener((view, color) -> {
                                if (getAnnotationEditingController()!= null) {
                                    for (Annotation annotation : annotations) {
                                        annotation.setColor(color);
                                    }
                                }
                            });
                            return detailView;
                        }
                    };

            // Set custom annotation inspector controllers to the activity.
            setCreationInspectorController(customAnnotationCreationInspector);
            setEditingInspectorController(customAnnotationEditingInspector);

            // Restore inspectors state.
            if (savedInstanceState!= null) {
                customAnnotationCreationInspector.onRestoreInstanceState(savedInstanceState);
                customAnnotationEditingInspector.onRestoreInstanceState(savedInstanceState);
            }
        }

        @NonNull
        private Context getContext() {
            return this;
        }

        /**
         * Custom implementation of the {@link AnnotatingInspectorController} showing simplified
         * annotation inspector in a dialog.
         */
        private class CustomAnnotationCreationInspector implements AnnotatingInspectorController {

            private static final String STATE_INSPECTOR_DIALOG_VISIBLE = "STATE_INSPECTOR_DIALOG_VISIBLE";

            @Nullable
            private AnnotatingController controller;

            @Nullable
            private AlertDialog dialog;

            @Nullable
            private Bundle restoredInstanceState;

            public void bindController(@NonNull AnnotatingController controller) {
                this.controller = controller;

                // Bind to annotation creation controller.
                controller.bindAnnotationInspectorController(this);

                // Restore saved state if available.
                onRestoreState();
            }

            public void unbindController() {
                cancel();
                if (controller!= null) {
                    controller.unbindAnnotationInspectorController();
                    this.controller = null;
                }
            }

            @Override
            public void onSaveInstanceState(@NonNull Bundle outState) {
                outState.putBoolean(STATE_INSPECTOR_DIALOG_VISIBLE, isAnnotationInspectorVisible());
            }

            @Override
            public void onRestoreInstanceState(@NonNull Bundle savedState) {
                this.restoredInstanceState = savedState;
                onRestoreState();
            }

            @Override
            public void showAnnotationInspector(boolean animate) {
                // Create custom layout for your inspector.
                View inspectorRoot = getLayoutInflater().inflate(R.layout.custom_annotation_inspector, null);
                LinearLayout inspectorContainer = inspectorRoot.findViewById(R.id.inspectorContainer);

                // We are reusing our inspector views just for the sake of simplicity.
                List<PropertyInspectorView> inspectorViews = getInspectorViews();
                if (inspectorViews == null) {
                    cancel();
                    return;
                }
                for (PropertyInspectorView inspectorView : inspectorViews) {
                    inspectorContainer.addView(inspectorView.getView());
                }

                // Create alert dialog with inspector layout set as content view.
                this.dialog = new AlertDialog.Builder(getContext()).setView(inspectorRoot).setPositiveButton(android.R.string.ok, (dialog, which) -> dialog.dismiss()).setCancelable(true).show();
            }

            @Override
            public void hideAnnotationInspector(boolean animate) {
                if (dialog!= null) {
                    dialog.cancel();
                }
            }

            @Override
            public void toggleAnnotationInspector(boolean animate) {
                if (isAnnotationInspectorVisible()) {
                    hideAnnotationInspector(animate);
                } else {
                    showAnnotationInspector(animate);
                }
            }

            @Override
            public boolean isAnnotationInspectorVisible() {
                return dialog!= null && dialog.isShowing();
            }

            @Override
            public boolean hasAnnotationInspector() {
                // Enable annotation inspector only for ink and free-text annotations.
                return controller!= null
                        && controller.getActiveAnnotationTool()!= null
                        && (controller.getActiveAnnotationTool() == AnnotationTool.INK
                                || controller.getActiveAnnotationTool() == AnnotationTool.FREETEXT);
            }

            public void cancel() {
                if (dialog!= null) {
                    dialog.cancel();
                    dialog = null;
                }
            }

            @Nullable
            private List<PropertyInspectorView> getInspectorViews() {
                PdfFragment fragment = getPdfFragment();
                if (controller == null || fragment == null) return null;

                final AnnotationPreferencesManager annotationPreferences = fragment.getAnnotationPreferences();
                final AnnotationTool annotationTool = controller.getActiveAnnotationTool();
                final AnnotationToolVariant annotationToolVariant = controller.getActiveAnnotationToolVariant();
                if (annotationTool == null || annotationToolVariant == null) return null;

                List<PropertyInspectorView> inspectorViews = new ArrayList<>();

                // Create color picker.
                ColorPickerInspectorDetailView colorPicker = new ColorPickerInspectorDetailView(
                        getContext(), CREATION_PICKER_COLORS, controller.getColor(), false);

                colorPicker.setOnColorPickedListener((view, color) -> {
                    annotationPreferences.setColor(annotationTool, annotationToolVariant, color);
                    controller.setColor(color);
                });
                int padding = dpToPx(getContext(), 8);
                colorPicker.setPadding(padding, padding, padding, padding);
                inspectorViews.add(colorPicker);

                // Create thickness picker for ink annotations.
                if (annotationTool == AnnotationTool.INK) {
                    SliderPickerInspectorView thicknessPicker = new SliderPickerInspectorView(
                            getContext(),
                            "Thickness",
                            "%d pt",
                            1,
                            20,
                            (int) controller.getThickness(),
                            (view, value) -> {
                                annotationPreferences.setThickness(annotationTool, annotationToolVariant, value);
                                controller.setThickness(value);
                            });
                    inspectorViews.add(thicknessPicker);
                }

                // Create text size picker for free-text annotation.
                if (annotationTool == AnnotationTool.FREETEXT) {
                    SliderPickerInspectorView textSizePicker = new SliderPickerInspectorView(
                            getContext(),
                            "Text size",
                            "%d pt",
                            10,
                            32,
                            (int) controller.getTextSize(),
                            (view, value) -> {
                                annotationPreferences.setTextSize(annotationTool, annotationToolVariant, value);
                                controller.setTextSize(value);
                            });
                    inspectorViews.add(textSizePicker);
                }

                return inspectorViews;
            }

            private void onRestoreState() {
                // Restore state when bound to controller and having restored state.
                if (controller == null || restoredInstanceState == null) return;
                boolean isDialogVisible = restoredInstanceState.getBoolean(STATE_INSPECTOR_DIALOG_VISIBLE, false);
                if (isDialogVisible) {
                    showAnnotationInspector(false);
                }
                restoredInstanceState = null;
            }
        }
    }
}

```

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

