
如上图所示,用
dialog
来选择证件类型,在平时的使用中,类似的用法还有很多,比如,选择年月日、选择职业等等。选择型Dialog
是Dialog
中最常见的。本来觉得没必要做一个模块,但是后来遇到的情况越来越多,方式越来越复杂,想来想去,做个单独的模块还是很有必要的,每次在这个dialog的调试上面也是要花费不少时间的。
一、选择型Dialog的几种模式
单级单选模式

单级,即列表只有一级;单选,即只选择一个。
这种是我们日常中最最常用的。
多级底部单选模式

多级,即有子类或者说是有子节点;底部单选指的是只有最后一个节点可以点击,有子节点的选项是不可选的。如上图中,军官证和士兵证1可选,但是士兵证不可选。
以上模式主要应对的场景是不定级的选择时,要选择最精准的一个选项。比如杭州市的区县信息,这就是一个不定级的选择模型,不知道有多少级,但是要求要选择一个最准确的位置信息。
多级单选模式
同上图一样,区别在于不是只有底部可选,父节点也可选。
如上图的军官证和士兵证都可选。
单级多选模式

顾名思义,单级列表中进行多选,点击确定返回信息列表。
多级多选模式

需要注意的是,点击父节点时,子节点自动被选中。当子节点都被取消时,父节点自动被取消。
多选顺序模式

这是我遇到的一种比较特殊的需求,要求记录点击的顺序,输出跟点击顺序相同的列表。
二、简单的使用
单选
new MultiSelectionDialogManager
.Builder()
//当前Activity
.setActivity(MainActivity.this)
.setTitle("证件类型")
.setCanceledOnTouchOutside(true)
.setDatas(CardTypeEnum.getDatas())
.setType(DialogType.SINGLE)
.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onClick(Node node, int position) {
Toast.makeText(MainActivity.this, node.getName(), Toast.LENGTH_SHORT)
.show();
}
})
.build().show();
多选
new MultiSelectionDialogManager
.Builder()
//当前Activity
.setActivity(MainActivity.this)
.setTitle("证件类型")
.setCanceledOnTouchOutside(true)
.setDatas(CardTypeEnum.getDatas())
.setType(DialogType.MULTI)
.setOnClickListener(new OnClickListener() {
@Override
public void onPositive(List<Node> list) {
StringBuilder sb = new StringBuilder();
for (Node node : list) {
sb.append(node.getName() + ",");
}
Toast.makeText(MainActivity.this, sb.toString(), Toast.LENGTH_SHORT)
.show();
}
@Override
public void onNegative() {
}
})
.build().show();
选择型Dialog主要需要的数据有:
/**
* 四个个必填项
*/
private Activity mActivity;
private String title;//dialog标题
private DialogType type;//dialog类型
private List<Node> mDatas;//数据流
private OnItemClickListener onItemClickListener;//选项点击事件
private int mThemeColor;//主题颜色
@DrawableRes
private int mTopPic;//顶部图片
private boolean canceledOnTouchOutside;//是否外部取消
private OnClickListener onClickListener;//按钮点击事件
private int limited;//当排序选择时候的限制个数
三、核心
选择型Dialog
的核心自然就是Dialog
了,之前选用的都是AlertDialog
,谷歌官方建议我们使用DialogFragment
,所有后期我就改成了DialogFragment
,方便实现更多的效果,也避免了各种问题,dialog经常有各种各样的奇奇怪怪问题,做过的人肯定都深有体会。
另外一个核心就是动画效果,因为这次的目的主要在功能上,所以动画和美工上我调试的时间较少。其实动画效果在Dialog
上还是很重要的,能够更好地和人进行交互,符合人的感官感受,不会显得那么突兀。细节方面也是很重要的。
四、版本
目前我已经发布了1.0.0
版本,后期根据小伙伴的建议会慢慢增加一些视觉效果。另外代码肯定还是要再进行优化的,因为写得比较匆忙,感觉代码不是那么美观。
其实有时候写代码就是这样,一个思路形成了,后面就很难掰过来,顺着这个思路一直写到底,可能中途会觉得“会不会有更优秀的解决方案呢?”,但是一时就是想不起来,过一段时间突然又灵光一现,然后进行代码重构。
也希望小伙伴多提意见用于改进。
网友评论