Skip to content

PopMenu_tc

Kongzue edited this page May 17, 2024 · 6 revisions

🌐 View English Document | 简体中文文档

📜上下文菜單 PopMenu

簡單提示 PopTip

提供一個輕量化的菜單,可以附着於一個 View 展開,或者在螢幕中央直接顯示,用於實現簡單選擇。

也可以使用 其他主題 以豐富菜單的樣式:

簡單提示 PopTip

顯示一個簡單 PopMenu

使用以下代碼顯示一個 PopMenu

PopMenu.show("添加", "編輯", "刪除", "分享");

也可以使用 List<CharSequence> 來設置菜單內容。

為 PopMenu 設置圖標

要設置菜單圖標可以直接指定,對於某一項菜單不需要圖標的可以直接傳入 0:

.setIconResIds(R.mipmap.img_dialogx_demo_add, R.mipmap.img_dialogx_demo_edit...)

圖標是否根據亮暗色主題進行染色處理可通過以下方法調整:

.setAutoTintIconInLightOrDarkMode(boolean)

(可選)使用回調方式設置圖標:

PopMenu.show("添加", "編輯", "刪除", "分享")
        .setOnIconChangeCallBack(new OnIconChangeCallBack<PopMenu>(true) {
    @Override
    public int getIcon(PopMenu dialog, int index, String menuText) {
        switch (index) {
            case 0:
                return R.mipmap.img_dialogx_demo_add;
            case 1:
                return R.mipmap.img_dialogx_demo_edit;
            case 2:
                return R.mipmap.img_dialogx_demo_delete;
            case 3:
                return R.mipmap.img_dialogx_demo_share;
            default:
                return 0;
        }
    }
});

顯示一個 PopMenu,並使它依附於一個 View 展開

PopMenu.show(view, new String[]{"選項1", "選項2", "選項3"})
    .setOverlayBaseView(true);

要調整依附位置,請參考下圖

簡單提示 PopTip

範例代碼:

PopMenu.show(view, new String[]{"選項1", "選項2", "選項3"})
        .setOverlayBaseView(false)
        .setAlignGravity(Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL);

菜單是否覆蓋在綁定的 view 上:

OverlayBaseView

範例代碼:

.setOverlayBaseView(false)

點擊菜單回調

PopMenu.show("選項1", "選項2", "選項3")
        .setOnMenuItemClickListener(new OnMenuItemClickListener<PopMenu>() {
            @Override
            public boolean onClick(PopMenu dialog, CharSequence text, int index) {
                btnSelectMenu.setText(text);
                return false;
            }
        });

你還可以通過 getSelectIndex() 方法獲取已選中的菜單項索引,或通過 getSelectMenuText() 獲取已選中的菜單項文本。

設置一個已選項

設置已選擇的菜單項(菜單背景會有選中狀態的顯示)。

.setPressedIndex(index)

設置後,在菜單顯示時,指定索引的菜單項會顯示被選中狀態(底色)。

生命週期回調

想要監控對話框的生命週期,可以實現其 .setDialogLifecycleCallback(...) 接口,建議使用build()方法構建對話框:

PopMenu.build()
        .setMenuList(new String[]{"選項1", "選項2", "選項3"})
        .setDialogLifecycleCallback(new DialogLifecycleCallback<PopMenu>() {
            @Override
            public void onShow(PopMenu dialog) {
                super.onShow(dialog);
            }
            
            @Override
            public void onDismiss(PopMenu dialog) {
                super.onDismiss(dialog);
            }
        })
        .show();

PopMenu 也支持 Lifecycle,你可以使用 .getLifecycle() 獲取 Lifecycle 對象。

你也可以通過使用 new 構建實例時,override 的生命週期事件的方式來處理生命週期事務,例如:

//複寫事件演示
new PopMenu() {
    @Override
    public void onShow(PopMenu dialog) {
        //...
        tip("onShow");
    }
    @Override
    public void onDismiss(PopMenu dialog) {
        //...
        tip("onDismiss");
    }
}

你也可以使用方法 .onShow(DialogXRunnable).onDismiss(DialogXRunnable),來處理生命週期事務,例如:

PopMenu.show(...)
        .onShow(new DialogXRunnable<PopMenu>() {
            @Override
            public void run(PopMenu dialog) {
                //PopMenu show!
            }
        })
        .onDismiss(new DialogXRunnable<PopMenu>() {
            @Override
            public void run(PopMenu dialog) {
                //PopMenu dismiss!
            }
        });

自定義佈局

要實現在對話框中加入自定義佈局,請先準備好自定義佈局文件,然後使用以下方法構建:

PopMenu.build()
        .setCustomView(new OnBindView<PopMenu>(R.layout.layout_custom_view) {
            @Override
            public void onBind(PopMenu dialog, View v) {
                
            }
        })
        .setMenuList(new String[]{"選項1", "選項2", "選項3"})
        .show();

回調參數中,v 為您給定的佈局文件的實例化組件,您可以通過 v.findViewById(resId)來實例化其他子佈局組件,並在 onBind 方法中設置其功能和事件回調。

自定義進入和關閉動畫

對 PopMenu 全局生效的的動畫修改:

你可以通過靜態屬性直接修改全局 PopMenu 的動畫:

//設置全局 PopTip入場動畫時間
PopMenu.overrideEnterDuration = 1000;
//設置全局 PopTip出場動畫時間
PopMenu.overrideExitDuration = 1000;

其他額外方法

//設置菜單內容(List<CharSequence>、String[]或CharSequence[])
.setMenuList(...)

//設置菜單項目(無級)
.setMenus("添加", "編輯", "刪除", "分享"...);

//設置圖標(無級)
.setIconResIds(R.mipmap.img_dialogx_demo_add, R.mipmap.img_dialogx_demo_edit...)

//關閉對話框
.dismiss();

//設置菜單高度
.setHeight(int);

//設置菜單寬度
.setWidth(int);

//設置菜單文字樣式
.setMenuTextInfo(TextInfo);

//是否允許超出螢幕顯示
.setOffScreen(boolean);

//是否覆蓋(依附)在綁定的 View 上
.setOverlayBaseView(boolean)

//獲取對話框實例化對象,您可以通過此方法更深度的訂製Dialog的功能
.getDialogImpl()

//獲取自定義佈局實例
.getCustomView()

//設置對話框圓角(會裁切內容顯示)
.setRadius(float px)

//是否處於顯示狀態
.isShow()

//置頂對話框
.bringToFront()

//指定對話框顯示層級
.setThisOrderIndex(int)

額外組件

TextInfo

TextInfo 用於存儲基礎文本樣式設置,其包含一系列屬性和響應的 get/set 方法,例如方法解釋如下:

屬性 解釋 默認值
fontSize 字號大小,值為-1時使用默認樣式,單位:dp -1
gravity 對齊方式,值為-1時使用默認樣式,取值可使用Gravity.CENTER等對齊方式 -1
fontColor 文字顏色,值為1時使用默認樣式,取值可以用Color.rgb(r,g,b)等方式獲取 1
bold 是否粗體 false

請注意,fontColor 為 ColorInt 值,您可以使用 Color.parseColor("#4D000000") 設置一個 HEX 色值,或使用資源 getResources().getColor(R.color.black30) 設置一個顏色的資源值,請勿直接傳入資源 ID,它可能會無效。

單獨指定樣式

若你的 App 引入了多種主題,在特定場景下需要使對話框顯示為某種非全局的主體樣式,可使用 .build() 構建對話框,然後使用 .setStyle(style) 來指定主題樣式,在最後執行 .show() 命令顯示對話框,例如:

PopMenu.build()
        //或直接使用 .build(IOSStyle.style())
        .setStyle(IOSStyle.style())
        .setMenuList(new String[]{"Menu 1", "Menu 2", "Menu 3"})
        .show();
Clone this wiki locally