-
Notifications
You must be signed in to change notification settings - Fork 223
PopMenu_tc
🌐 View English Document | 简体中文文档
提供一個輕量化的菜單,可以附着於一個 View 展開,或者在螢幕中央直接顯示,用於實現簡單選擇。
也可以使用 其他主題 以豐富菜單的樣式:
PopMenu.show("添加", "編輯", "刪除", "分享");
也可以使用 List<CharSequence>
來設置菜單內容。
要設置菜單圖標可以直接指定,對於某一項菜單不需要圖標的可以直接傳入 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; //返回0代表不顯示圖標
}
}
});
在 0.0.50.beta27 版本更新後,你還可以通過網絡異步加載菜單圖標,此功能需要使用全新的 MenuIconAdapter 來實現,具體方法如下:
.setOnIconChangeCallBack(new MenuIconAdapter<PopMenu>(false) {
String[] urls = {
"http://www.kongzue.com/test/res/dialogx/ic_menu_add.png",
"http://www.kongzue.com/test/res/dialogx/ic_menu_read_later.png",
"http://www.kongzue.com/test/res/dialogx/ic_menu_link.png"
};
@Override
public boolean applyIcon(PopMenu dialog, int index, String menuText, ImageView iconImageView) {
Glide.with(MainActivity.this).load(urls[index]).into(iconImageView); //演示通過 Glide 加載網絡資源到菜單圖標中
return true;
}
});
回調方法 applyIcon 中會暴露菜單圖標的 ImageView iconImageView,你可以通過任意異步框架完成圖標資源的加載,返回值 true 表示該菜單項的圖標需要顯示,返回 false 該菜單項的圖標將隱藏。
PopMenu.show(view, new String[]{"選項1", "選項2", "選項3"})
.setOverlayBaseView(true);
範例代碼:
PopMenu.show(view, new String[]{"選項1", "選項2", "選項3"})
.setOverlayBaseView(false)
.setAlignGravity(Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL);
菜單是否覆蓋在綁定的 view 上:
範例代碼:
.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 的動畫:
//設置全局 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 用於存儲基礎文本樣式設置,其包含一系列屬性和響應的 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();