返回

从零认识弹窗管理,及实现流畅的人才招聘首页

Android

一、背景

由于业务需要,页面中通常会有很多弹窗功能。并且由于叠加展示的用户体验不好的原因,这些弹窗通常会被要求互斥出现。

在之前的设计里,这些弹窗是杂乱没有管理的。每次新添加一个弹窗业务,需要开发同学自己去定位弹窗的层级,和关心遮罩层之类的公共问题。

这样设计带来的问题是:

  • 很难维护,弹窗多的时候,很难判断一个弹窗的优先级
  • 很难定位问题,当弹窗出现问题的时候,很难判断是弹窗自身的问题,还是管理的问题。

二、解决思路

为了解决以上问题,我们设计了弹窗管理的组件,来统一管理所有的弹窗。

弹窗管理的核心思想是:

  • 将所有弹窗都统一管理起来,并给他们一个层级。
  • 当一个弹窗需要显示的时候,首先判断当前是否有弹窗正在显示,如果有,则先把正在显示的弹窗隐藏,然后再把当前弹窗显示出来。
  • 当一个弹窗需要隐藏的时候,直接隐藏即可。

三、具体实现

我们使用了一个单例模式来实现弹窗管理。

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);
                }
            }
        });
    }
}

五、结语

通过使用弹窗管理,我们可以很容易地管理所有的弹窗,并且可以保证弹窗的互斥显示。

这种设计思想也可以应用到其他需要管理多个弹窗的场景中。