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_LTorPosition_RB. - Bottom toolbar: use
Position_CENTER. - Wrong position can cause overlapping items or layout issues.
- Top toolbar: use
- 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.
| Panel | PanelSpec | panelType (integer) |
|---|---|---|
| Bookmarks | PanelSpec.BOOKMARKS | 0 |
| Outline | PanelSpec.OUTLINE | 1 |
| Comments | PanelSpec.ANNOTATIONS | 2 |
| Attachments | PanelSpec.ATTACHMENTS | 3 |
| Digital Signatures | PanelSpec.SIGNATURES | 4 |
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 // 6083.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
| Group | Constant | ID |
|---|---|---|
| Primary | GROUP_ACTION_MENU_PRIMARY | 1000 |
| Secondary | GROUP_ACTION_MENU_SECONDARY | 1001 |
4.3.2 Menu Items
| Group | Item Constant | ID |
|---|---|---|
GROUP_ACTION_MENU_PRIMARY | ITEM_PRIMARY_PROTECT | 1 |
GROUP_ACTION_MENU_PRIMARY | ITEM_PRIMARY_COMMENT_FIELDS | 2 |
GROUP_ACTION_MENU_SECONDARY | ITEM_SECONDARY_SAVE_AS | 1 |
GROUP_ACTION_MENU_SECONDARY | ITEM_SECONDARY_REDUCE_FILE_SIZE | 2 |
GROUP_ACTION_MENU_SECONDARY | ITEM_SECONDARY_PRINT | 3 |
GROUP_ACTION_MENU_SECONDARY | ITEM_SECONDARY_FLATTEN | 4 |
GROUP_ACTION_MENU_SECONDARY | ITEM_SECONDARY_SCREEN | 5 |
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).
| Item | Sub-item Constant | ID |
|---|---|---|
ITEM_PRIMARY_PROTECT | ITEM_PROTECT_REDACTION | 1 |
ITEM_PRIMARY_PROTECT | ITEM_PROTECT_REMOVE_PASSWORD | 2 |
ITEM_PRIMARY_PROTECT | ITEM_PROTECT_FILE_ENCRYPTION | 3 |
ITEM_PRIMARY_PROTECT | ITEM_PROTECT_TRUSTED_CERTIFICATES | 4 |
ITEM_PRIMARY_COMMENT_FIELDS | ITEM_COMMENTS_FIELDS_IMPORT_COMMENTS | 1 |
ITEM_PRIMARY_COMMENT_FIELDS | ITEM_COMMENTS_FIELDS_EXPORT_COMMENTS | 2 |
ITEM_PRIMARY_COMMENT_FIELDS | ITEM_COMMENTS_FIELDS_SUMMARIZE_COMMENTS | 3 |
ITEM_PRIMARY_COMMENT_FIELDS | ITEM_COMMENTS_FIELDS_RESET_FORM_FIELDS | 4 |
ITEM_PRIMARY_COMMENT_FIELDS | ITEM_COMMENTS_FIELDS_IMPORT_FORM_DATA | 5 |
ITEM_PRIMARY_COMMENT_FIELDS | ITEM_COMMENTS_FIELDS_EXPORT_FORM_DATA | 6 |