Android 如何防止一个片段被多次添加?

Android 如何防止一个片段被多次添加?,android,android-fragments,android-ui,android-button,Android,Android Fragments,Android Ui,Android Button,当点击UI元素(如按钮)时,通常会将片段添加到布局中。如果用户非常快地多次点击按钮,则可能会多次添加片段,从而导致各种问题 如何防止这种情况发生?我创建了一个助手方法,确保仅在片段不存在时添加该片段: public static void addFragmentOnlyOnce(FragmentManager fragmentManager, Fragment fragment, String tag) { // Make sure the current transaction fin

当点击UI元素(如按钮)时,通常会将片段添加到布局中。如果用户非常快地多次点击按钮,则可能会多次添加片段,从而导致各种问题


如何防止这种情况发生?

我创建了一个助手方法,确保仅在片段不存在时添加该片段:

public static void addFragmentOnlyOnce(FragmentManager fragmentManager, Fragment fragment, String tag) {
    // Make sure the current transaction finishes first
    fragmentManager.executePendingTransactions();

    // If there is no fragment yet with this tag...
    if (fragmentManager.findFragmentByTag(tag) == null) {
        // Add it
        FragmentTransaction transaction = fragmentManager.beginTransaction();
        transaction.add(fragment, tag);
        transaction.commit();
    }
}
来自活动或其他片段的简单调用:

addFragmentOnlyOnce(getFragmentManager(), myFragment, "myTag");

这适用于android.app.*和android.support.app.*软件包

在我的解决方案中,我尝试多次快速点击按钮来显示对话框片段

            FragmentManager fm = getSupportFragmentManager();
            Fragment oldFragment = fm.findFragmentByTag("wait_modal");

            if(oldFragment != null && oldFragment.isAdded())
                return;

            if(oldFragment == null && !please_wait_modal.isAdded() && !please_wait_modal.isVisible()){
                fm.executePendingTransactions();
                please_wait_modal.show(fm,"wait_modal");
            }

请注意,如果对话框很快连续显示,例如在不到10毫秒的时间内显示两次,则答案中的方法不起作用。原因是经典的多线程问题“先检查后执行”。对于这个问题没有通用的解决方案,您必须使用某种同步来自己做饭。