Skip to content

Customize UI Elements via APIs

This section explains how to show, hide, add, remove, and change built-in UI at runtime with UI Extensions APIs, including:

  • Top/bottom toolbars
  • Panels (e.g. Outline)
  • View setting bar
  • More menu

Note

Examples use samples/complete_pdf_viewer. Add code in PDFReaderFragment.java after mUiExtensionsManager = new UIExtensionsManager(...).

1. Customize Top/Bottom Toolbars

Read “Position and index” first, then find examples by task.

1.1 Position and Index (Important)

For addItem, removeItem, getItemByIndex, etc., use BarName and TB_Position to target toolbar segment and region:

java
enum BarName {
    TOP_BAR,
    BOTTOM_BAR
}

enum TB_Position {
    Position_LT,
    Position_CENTER,
    Position_RB
}

Usage

  • Phone vs tablet: Tablets have no bottom toolbar by default.
  • Position:
    • Top toolbar: use Position_LT or Position_RB.
    • Bottom toolbar: use Position_CENTER.
    • Wrong position can cause overlapping items or layout issues.
  • Index: On phones, indices are independent for top-left, top-right, and bottom segments; tablets only have top left/right.
  • Label length: Keep top toolbar text ≤ 15 characters and bottom ≤ 8 to avoid layout issues.

1.2 Examples by Task

Tip

Phone and tablet layouts differ; some examples apply to one form factor only. See titles and comments.

1.2.1 Show or Hide Toolbars

Example 1: Hide Top Toolbar

java
mUiExtensionsManager.enableTopToolbar(false);

Example 2: Hide Bottom Toolbar (Phone Only)

java
mUiExtensionsManager.enableBottomToolbar(false);

1.2.2 Add Toolbar Buttons

Example 3: Add Custom Button to Top-Left Toolbar

Button creation and click handlers are similar; the main difference is position (Position_LT / Position_RB) and index:

java
BaseItemImpl mTopItem1 = new BaseItemImpl(getContext(), R.drawable.rd_delete_menu);

mTopItem1.setImageTintList(ColorStateList.valueOf(Color.WHITE));
mTopItem1.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        UIToast.getInstance(getActivity()).show("Add an item in the left top toolbar at the second position.");
    }
});
mUiExtensionsManager.getBarManager().addItem(IBarsHandler.BarName.TOP_BAR, BaseBar.TB_Position.Position_LT, mTopItem1, 1);

Example 4: Add Custom Button to Top-Right Toolbar

java
BaseItemImpl mTopItem2 = new BaseItemImpl(getContext(), R.drawable.rd_delete_menu);

mTopItem2.setImageTintList(ColorStateList.valueOf(Color.WHITE));
mTopItem2.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        UIToast.getInstance(getActivity()).show("Add an item in the right top toolbar at the first position");
    }
});
mUiExtensionsManager.getBarManager().addItem(IBarsHandler.BarName.TOP_BAR, BaseBar.TB_Position.Position_RB, mTopItem2, 0);

Example 5: Add Button to Bottom Toolbar (Phone Only)

java
mUiExtensionsManager.getBarManager().addItem(
        IBarsHandler.BarName.BOTTOM_BAR,
        BaseBar.TB_Position.Position_CENTER,
        "",
        R.drawable.ic_bar_item_more,
        0,
        new IBarsHandler.IItemClickListener() {
            @Override
            public void onClick(View v) {
                UIToast.getInstance(getActivity()).show("Add an item to the bottom toolbar at the first position.");
            }
        }
);

Example 6: Add Custom-Style Button to Bottom Toolbar (Phone Only)

java
BaseItemImpl mSettingBtn = new BaseItemImpl(this.getContext(), R.drawable.rd_annot_create_ok_selector);
mSettingBtn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        UIToast.getInstance(getActivity()).show("Add an item with custom style to the bottom toolbar at the second position.");
    }
});
mUiExtensionsManager.getBarManager().addItem(IBarsHandler.BarName.BOTTOM_BAR, BaseBar.TB_Position.Position_CENTER, mSettingBtn, 1);

1.2.3 Remove Toolbar Buttons

Example 7: Remove by Index (Phone Only)

java
mUiExtensionsManager.getBarManager().removeItem(
        IBarsHandler.BarName.BOTTOM_BAR,
        BaseBar.TB_Position.Position_CENTER,
        0
);

Example 8: Remove by BaseItem

java
mUiExtensionsManager.getBarManager().removeItem(
        IBarsHandler.BarName.TOP_BAR,
        BaseBar.TB_Position.Position_LT,
        mTopItem1
);

Example 9: Remove All Bottom Toolbar Buttons (Phone Only)

java
mUiExtensionsManager.getBarManager().removeAllItems(IBarsHandler.BarName.BOTTOM_BAR);

1.2.4 Show or Hide Specific Buttons

Example 10: Toggle a Button (More Menu Example)

java
// 获取需要显示/隐藏的按钮引用
final IBarsHandler barsHandler = (IBarsHandler) mUiExtensionsManager.getBarManager();
final IBaseItem moreItem = barsHandler.getItemByIndex(
        IBarsHandler.BarName.TOP_BAR,
        BaseBar.TB_Position.Position_RB,
        1
);

// 添加一个按钮,点击后隐藏 "moreItem"
BaseItemImpl topItem = new BaseItemImpl(getContext(), R.drawable.rd_delete_menu);
topItem.setImageTintList(ColorStateList.valueOf(Color.WHITE));
topItem.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        // 隐藏 "moreItem"
        mUiExtensionsManager.getBarManager().removeItem(
                IBarsHandler.BarName.TOP_BAR,
                BaseBar.TB_Position.Position_RB,
                moreItem
        );
    }
});
mUiExtensionsManager.getBarManager().addItem(IBarsHandler.BarName.TOP_BAR, BaseBar.TB_Position.Position_LT, topItem, 1);

// 添加一个按钮,点击后显示 "moreItem"
BaseItemImpl topItem2 = new BaseItemImpl(getContext(), R.drawable.common_add_icon);
topItem2.setImageTintList(ColorStateList.valueOf(Color.WHITE));
topItem2.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        // 显示 "moreItem"
        if (AppDisplay.isPad())
            mUiExtensionsManager.getBarManager().addItem(IBarsHandler.BarName.TOP_BAR, BaseBar.TB_Position.Position_RB, moreItem, 3);
        else
            mUiExtensionsManager.getBarManager().addItem(IBarsHandler.BarName.TOP_BAR, BaseBar.TB_Position.Position_RB, moreItem, 1);
    }
});
mUiExtensionsManager.getBarManager().addItem(IBarsHandler.BarName.TOP_BAR, BaseBar.TB_Position.Position_LT, topItem2, 2);

1.2.5 Toolbar Structure (Toolbar / Tabs / Entries)

Example 11: Remove Entire Bottom Toolbar (Phone Only)

java
mUiExtensionsManager.getBarManager().removeToolBar(IBarsHandler.BarName.BOTTOM_BAR);

Example 12: Add Custom Toolbar

java
View topView = View.inflate(getContext(), R.layout.test_top_layout, null);
mUiExtensionsManager.getBarManager().addCustomToolBar(IBarsHandler.BarName.TOP_BAR, topView);

Example 13: Remove “Form” Tab from Top Toolbar Center

java
mUiExtensionsManager.getMainFrame().removeTab(ToolbarItemConfig.ITEM_FORM_TAB);

Example 14: Remove “View” Entry

java
if (AppDisplay.isPad())
    mUiExtensionsManager.getMainFrame().removeTab(ToolbarItemConfig.ITEM_VIEW_TAB);
else
    mUiExtensionsManager.getBarManager().removeItem(
            IBarsHandler.BarName.BOTTOM_BAR,
            BaseBar.TB_Position.Position_CENTER,
            1
    );

2. Customize Panels

2.1 API Overview

java
// Add sub-panel. Skipped if type already exists.
public void addPanel(PanelSpec panelSpec);
public void addPanel(int index, PanelSpec panelSpec);

// Remove sub-panel.
public void removePanel(int panelType);
public void removePanel(PanelSpec panelSpec);

For removePanel(PanelSpec), use the built-in panel table below; for removePanel(int panelType), pass the panelType integer.

PanelPanelSpecpanelType (integer)
BookmarksPanelSpec.BOOKMARKS0
OutlinePanelSpec.OUTLINE1
CommentsPanelSpec.ANNOTATIONS2
AttachmentsPanelSpec.ATTACHMENTS3
Digital SignaturesPanelSpec.SIGNATURES4

2.2 Examples by Task

2.2.1 Remove Built-in Panels

Example 1: Remove Outline Panel via Button
java
BaseItemImpl removePanel = new BaseItemImpl(getActivity(), R.drawable.rd_delete_menu);

removePanel.setImageTintList(ColorStateList.valueOf(Color.WHITE));

removePanel.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        mUiExtensionsManager.getPanelManager().removePanel(PanelSpec.OUTLINE);
    }
});
mUiExtensionsManager.getBarManager().addItem(IBarsHandler.BarName.TOP_BAR, BaseBar.TB_Position.Position_LT, removePanel, 1);

2.2.2 Add Custom Panel

Example 2: Add Custom Panel on Click
java
BaseItemImpl customPanel = new BaseItemImpl(getActivity(), R.drawable.common_add_icon);

customPanel.setImageTintList(ColorStateList.valueOf(Color.WHITE));

customPanel.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        mUiExtensionsManager.getPanelManager().addPanel(new CustomPanel(getContext()));
    }
});
mUiExtensionsManager.getBarManager().addItem(IBarsHandler.BarName.TOP_BAR, BaseBar.TB_Position.Position_LT, customPanel, 1);

CustomPanel must implement PanelSpec, for example:

java
package com.foxit.home;

import android.content.Context;
import android.content.res.ColorStateList;
import android.view.View;
import android.widget.TextView;

import com.foxit.uiextensions.controls.panel.PanelSpec;
import com.foxit.uiextensions.controls.toolbar.BaseBar;
import com.foxit.uiextensions.controls.toolbar.IBaseItem;
import com.foxit.uiextensions.controls.toolbar.impl.BaseItemImpl;
import com.foxit.uiextensions.controls.toolbar.impl.TopBarImpl;

public class CustomPanel implements PanelSpec {

    private Context mContext;

    public CustomPanel(Context context) {
        mContext = context;
    }

    @Override
    public int getIcon() {
        return R.drawable.toolbar_thumbnail_icon;
    }

    @Override
    public ColorStateList getIconTint() {
        return null;
    }

    @Override
    public int getPanelType() {
        return 100;
    }

    @Override
    public View getTopToolbar() {
        TopBarImpl topBar = new TopBarImpl(mContext);
        IBaseItem baseItem = new BaseItemImpl(mContext);
        baseItem.setText("Custom Panel");
        topBar.addView(baseItem, BaseBar.TB_Position.Position_CENTER);
        return topBar.getContentView();
    }

    @Override
    public View getContentView() {
        TextView textView = new TextView(mContext);
        textView.setText("This is empty");
        return textView;
    }

    @Override
    public void onActivated() {

    }

    @Override
    public void onDeactivated() {

    }
}

3. Customize View Setting Bar

Use setVisible to show or hide options in the View Setting Bar.

3.1 API Overview

java
public void setVisible(int type, boolean visible);

3.2 type Values (Constants)

java
IViewSettingsWindow.TYPE_SINGLE_PAGE        // 1
IViewSettingsWindow.TYPE_FACING_PAGE        // 2
IViewSettingsWindow.TYPE_COVER_PAGE         // 4
IViewSettingsWindow.TYPE_DAY                // 8
IViewSettingsWindow.TYPE_PAGE_COLOR         // 16
IViewSettingsWindow.TYPE_NIGHT              // 32
IViewSettingsWindow.TYPE_CONTINUOUS_PAGE    // 64
IViewSettingsWindow.TYPE_FIT_PAGE           // 128
IViewSettingsWindow.TYPE_FIT_WIDTH          // 256
IViewSettingsWindow.TYPE_REFLOW             // 288
IViewSettingsWindow.TYPE_CROP               // 320
IViewSettingsWindow.TYPE_TTS                // 384
IViewSettingsWindow.TYPE_AUTO_FLIP          // 512
IViewSettingsWindow.TYPE_ROTATE_VIEW        // 544
IViewSettingsWindow.TYPE_PAN_ZOOM           // 576
IViewSettingsWindow.TYPE_RIGHT_TO_LEFT      // 608

3.3 Examples

Example 1: Hide “Fit Width” Option

java
mUiExtensionsManager.getSettingWindow().setVisible(IViewSettingsWindow.TYPE_FIT_WIDTH, false);

4. Customize More Menu

The More Menu supports hiding groups/items and adding custom groups and items.

4.1 API Overview

java
// Add menu items via IMenuItem.
IMenuGroup.addItem(IMenuItem item);
IMenuGroup.addItem(CharSequence title);
IMenuGroup.addItem(Drawable icon, CharSequence title);

// Toggle visibility.
IMenuGroup.setVisible(boolean visible);
IMenuItem.setVisible(boolean visible);

4.2 Examples

Example 1: Hide a Menu Group

java
IMenuView menuView = mUiExtensionsManager.getMenuView();
IMenuGroup menuGroup = menuView.getGroup(MoreMenuConstants.GROUP_ACTION_MENU_PRIMARY);
menuGroup.setVisible(false);

Example 2: Hide a Menu Item

java
IMenuView menuView = mUiExtensionsManager.getMenuView();
IMenuGroup menuGroup = menuView.getGroup(MoreMenuConstants.GROUP_ACTION_MENU_SECONDARY);
IMenuItem menuItem = menuGroup.getItem(MoreMenuConstants.ITEM_SECONDARY_PRINT);
menuItem.setVisible(false);

Example 3: Add Custom Menu Group and Items

java
IMenuView menuView = mUiExtensionsManager.getMenuView();
IMenuGroup customGroup = menuView.addGroup("Custom Group");
IMenuItem item1 = customGroup.addItem(AppResource.getDrawable(getActivity(), R.drawable.rd_comment_menu), "comment");
item1.setOnMenuItemClickListener(new IMenuItem.OnMenuItemClickListener() {
    @Override
    public void onClick(IMenuItem item) {
        UIToast.getInstance(getActivity()).show("I am item1");
    }
});
IMenuItem item2 = customGroup.addItem(AppResource.getDrawable(getActivity(), R.drawable.rd_delete_menu), "delete");
item2.setOnMenuItemClickListener(new IMenuItem.OnMenuItemClickListener() {
    @Override
    public void onClick(IMenuItem item) {
        UIToast.getInstance(getActivity()).show("I am item2");
    }
});

4.3 Built-in Menu Reference (MoreMenuConstants)

Use MoreMenuConstants to locate built-in groups and items. The table lists the default More Menu in complete_pdf_viewer; visible items vary by license, enabled modules, device type, and product version.

4.3.1 Menu Groups

GroupConstantID
PrimaryGROUP_ACTION_MENU_PRIMARY1000
SecondaryGROUP_ACTION_MENU_SECONDARY1001

4.3.2 Menu Items

GroupItem ConstantID
GROUP_ACTION_MENU_PRIMARYITEM_PRIMARY_PROTECT1
GROUP_ACTION_MENU_PRIMARYITEM_PRIMARY_COMMENT_FIELDS2
GROUP_ACTION_MENU_SECONDARYITEM_SECONDARY_SAVE_AS1
GROUP_ACTION_MENU_SECONDARYITEM_SECONDARY_REDUCE_FILE_SIZE2
GROUP_ACTION_MENU_SECONDARYITEM_SECONDARY_PRINT3
GROUP_ACTION_MENU_SECONDARYITEM_SECONDARY_FLATTEN4
GROUP_ACTION_MENU_SECONDARYITEM_SECONDARY_SCREEN5

4.3.3 Sub-items

Some items have sub-items (e.g. ITEM_PRIMARY_PROTECT, ITEM_PRIMARY_COMMENT_FIELDS). Use the constants and IDs below (MoreMenuConstants).

ItemSub-item ConstantID
ITEM_PRIMARY_PROTECTITEM_PROTECT_REDACTION1
ITEM_PRIMARY_PROTECTITEM_PROTECT_REMOVE_PASSWORD2
ITEM_PRIMARY_PROTECTITEM_PROTECT_FILE_ENCRYPTION3
ITEM_PRIMARY_PROTECTITEM_PROTECT_TRUSTED_CERTIFICATES4
ITEM_PRIMARY_COMMENT_FIELDSITEM_COMMENTS_FIELDS_IMPORT_COMMENTS1
ITEM_PRIMARY_COMMENT_FIELDSITEM_COMMENTS_FIELDS_EXPORT_COMMENTS2
ITEM_PRIMARY_COMMENT_FIELDSITEM_COMMENTS_FIELDS_SUMMARIZE_COMMENTS3
ITEM_PRIMARY_COMMENT_FIELDSITEM_COMMENTS_FIELDS_RESET_FORM_FIELDS4
ITEM_PRIMARY_COMMENT_FIELDSITEM_COMMENTS_FIELDS_IMPORT_FORM_DATA5
ITEM_PRIMARY_COMMENT_FIELDSITEM_COMMENTS_FIELDS_EXPORT_FORM_DATA6