返回
从零认识弹窗管理,及实现流畅的人才招聘首页
Android
2023-10-11 19:56:00
一、背景
由于业务需要,页面中通常会有很多弹窗功能。并且由于叠加展示的用户体验不好的原因,这些弹窗通常会被要求互斥出现。
在之前的设计里,这些弹窗是杂乱没有管理的。每次新添加一个弹窗业务,需要开发同学自己去定位弹窗的层级,和关心遮罩层之类的公共问题。
这样设计带来的问题是:
- 很难维护,弹窗多的时候,很难判断一个弹窗的优先级
- 很难定位问题,当弹窗出现问题的时候,很难判断是弹窗自身的问题,还是管理的问题。
二、解决思路
为了解决以上问题,我们设计了弹窗管理的组件,来统一管理所有的弹窗。
弹窗管理的核心思想是:
- 将所有弹窗都统一管理起来,并给他们一个层级。
- 当一个弹窗需要显示的时候,首先判断当前是否有弹窗正在显示,如果有,则先把正在显示的弹窗隐藏,然后再把当前弹窗显示出来。
- 当一个弹窗需要隐藏的时候,直接隐藏即可。
三、具体实现
我们使用了一个单例模式来实现弹窗管理。
public class PopupManager {
private static PopupManager instance;
private Map<String, Popup> popupMap = new HashMap<>();
private PopupManager() {
}
public static PopupManager getInstance() {
if (instance == null) {
synchronized (PopupManager.class) {
if (instance == null) {
instance = new PopupManager();
}
}
}
return instance;
}
public void showPopup(Popup popup) {
Popup currentPopup = getCurrentPopup();
if (currentPopup != null) {
currentPopup.hide();
}
popupMap.put(popup.getTag(), popup);
popup.show();
}
public void hidePopup(Popup popup) {
popupMap.remove(popup.getTag());
popup.hide();
}
public Popup getCurrentPopup() {
for (Popup popup : popupMap.values()) {
if (popup.isShowing()) {
return popup;
}
}
return null;
}
}
四、在人才招聘首页的实现
在人才招聘首页,我们使用弹窗管理来管理所有的弹窗。
public class RecruitmentHomepageActivity extends AppCompatActivity {
private PopupManager popupManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_recruitment_homepage);
popupManager = PopupManager.getInstance();
// 添加一个弹窗按钮
Button showPopupButton = findViewById(R.id.show_popup_button);
showPopupButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Popup popup = new Popup(RecruitmentHomepageActivity.this);
popup.setTitle("这是一个弹窗");
popup.setContent("这是一个弹窗的内容");
popupManager.showPopup(popup);
}
});
// 添加一个隐藏弹窗按钮
Button hidePopupButton = findViewById(R.id.hide_popup_button);
hidePopupButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Popup currentPopup = popupManager.getCurrentPopup();
if (currentPopup != null) {
popupManager.hidePopup(currentPopup);
}
}
});
}
}
五、结语
通过使用弹窗管理,我们可以很容易地管理所有的弹窗,并且可以保证弹窗的互斥显示。
这种设计思想也可以应用到其他需要管理多个弹窗的场景中。