Android 为什么Dialogfragment会显示两次警报对话框?

Android 为什么Dialogfragment会显示两次警报对话框?,android,android-support-library,Android,Android Support Library,我试图在互联网运行时显示一个警报对话框。一切正常,但对话框显示了两次(一次重叠)。为什么对话框会显示两次,即使在显示之前我正在检查对话框实例是否为空。下面是我编写的代码 下面是在活动中编写的代码 BroadcastReceiver networkStateReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { Co

我试图在互联网运行时显示一个警报对话框。一切正常,但对话框显示了两次(一次重叠)。为什么对话框会显示两次,即使在显示之前我正在检查对话框实例是否为空。下面是我编写的代码

下面是在活动中编写的代码

BroadcastReceiver networkStateReceiver = new BroadcastReceiver() {

    @Override
    public void onReceive(Context context, Intent intent) {
        ConnectivityManager cm =
                (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);

        NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
        boolean isConnected = activeNetwork != null &&
                activeNetwork.isConnected();
        if (isConnected) {
            internetAvailable();
        } else {
            showNoInternetPopup();
        }
    }
};

protected abstract void internetAvailable();

protected void showNoInternetPopup() {
    SimpleAlertDialog alertDialog = new SimpleAlertDialog();
    alertDialog.show(getSupportFragmentManager(), "1001");
}


@Override
protected void onResume() {
    super.onResume();
    IntentFilter filter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
    registerReceiver(networkStateReceiver, filter);
}
下面是扩展dialogFragment的dialog类

public class SimpleAlertDialog extends DialogFragment {

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    // Use the Builder class for convenient dialog construction
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
    builder.setTitle("Your network seems to be unavailable")
            .setPositiveButton("OK", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int id) {
                    dismiss();
                }
            });
    // Create the AlertDialog object and return it
    return builder.create();

}

@Override
public void show(FragmentManager manager, String tag) {
    if (manager.findFragmentByTag(tag) == null) {
        super.show(manager, tag);
    }
}

}

我认为,问题在于你从操作系统获得双重回调。 记录它以进行双重验证。
如果确实如此,那么您需要自己处理弹出窗口,这样您就不会播放两次,将警报对话框保存为成员,然后对其调用isShown()。当然,如果其为空,则检查KC。

通过在暂停时注销接收器解决了此问题。。愚蠢的我

是的,我收到了双重回电,但为什么?如果(manager.findffragmentbytag(tag)==null){super.show(manager,tag);}它一经创建就不应该为null,我也在检查这个条件。原因是因为你注册了两次?在舱单上和活动上?或者只是操作系统问题,你需要在片段之前检查是否创建它。因为你创造了两个片段,但展示了一个。这是不好的做法,在那之前检查一下。