-
Notifications
You must be signed in to change notification settings - Fork 223
上下文菜单 PopMenu
🌐 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();