Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 当用户脱机时显示对话框,当用户联机时关闭对话框(使用broadcastReceiver)_Java_Android_Dialog_Broadcastreceiver - Fatal编程技术网

Java 当用户脱机时显示对话框,当用户联机时关闭对话框(使用broadcastReceiver)

Java 当用户脱机时显示对话框,当用户联机时关闭对话框(使用broadcastReceiver),java,android,dialog,broadcastreceiver,Java,Android,Dialog,Broadcastreceiver,这是我的基本活动,它扩展了类活动。我让我的其他活动扩展这个基本类: public abstract class Base extends Activity { private BroadcastReceiver netStateReceiver; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(getLa

这是我的基本活动,它扩展了类
活动
。我让我的其他活动扩展这个基本类:

public abstract class Base extends Activity {

private BroadcastReceiver netStateReceiver;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(getLayoutResourceId());
}
protected abstract int getLayoutResourceId();

@Override
protected void onPause() {
    if (netStateReceiver != null) {
        unregisterReceiver(netStateReceiver);
        netStateReceiver = null;
    }
    super.onPause();
}

@Override
protected void onResume() {
    if (netStateReceiver == null) {
        netStateReceiver = new BroadcastReceiver() {
            @Override
            public void onReceive(final Context context, Intent intent) {

                final Dialog offline = new Dialog(context, android.R.style.Theme_Light);

                //A change occurred in connection state. Check whether user has been become online or offline:
                if (!CheckNet()) {
                    //User became offline (show offline dialog):
                    offline.setContentView(R.layout.activity_offline);
                    offline.setTitle("offline");
                    offline.getWindow().setBackgroundDrawableResource(R.color.transparent);

                    offline.show();

                    final Button retry = (Button) offline.findViewById(R.id.button6);
                    retry.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View v) {
                            if (CheckNet()) {
                                offline.dismiss();
                            }
                        }
                    });

                }
                else {
                    //User became online (dismiss offline dialog):
                    if (offline.isShowing()) {
                        offline.dismiss();
                    }
                }
            }
        };
        registerReceiver(netStateReceiver, new IntentFilter(Values.CONNECTIVITY_RECEIVER_ACTION));
    }
    super.onResume();
}

private boolean CheckNet() {
    final ConnectivityManager conMgr = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    final NetworkInfo activeNetwork = conMgr.getActiveNetworkInfo();
    return (activeNetwork != null && activeNetwork.isConnectedOrConnecting());
}
}
正如您在代码中看到的,我已经注册了一个用于检查连接状态的接收器

我希望当用户脱机时,向用户显示一个对话框,并通知用户他已脱机,应该联机才能继续。这部分很好用

我还希望当该对话框显示时,当用户联机时,该对话框被取消,但该部分不起作用,对话框仍保留在显示器上


有什么问题,我如何取消该对话框?

您每次收到广播时都会创建一个新对话框,因此您取消的对话框与用于显示“您当前处于脱机状态”的对话框完全不同

尝试将“脱机”对话框放在“活动”中,而不是放在onReceive回调中

一个简单的例子是:

public abstract class Base extends Activity {

    private BroadcastReceiver netStateReceiver;

    final Dialog offline;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(getLayoutResourceId());

        // You create the dialog here instead within the onReceive callback
        offline = new Dialog(this, android.R.style.Theme_Light);
        offline.setContentView(R.layout.activity_offline);
        offline.setTitle("offline");
        offline.getWindow().setBackgroundDrawableResource(R.color.transparent);
    }


    @Override
    protected void onResume() {
        if (netStateReceiver == null) {
            netStateReceiver = new BroadcastReceiver() {
                @Override
                public void onReceive(final Context context, Intent intent) {
                    if (!CheckNet()) {
                        // Your dialog already exists, just show it immediately
                        offline.show();

                        final Button retry = (Button) offline.findViewById(R.id.button6);
                        retry.setOnClickListener(new View.OnClickListener() {
                            @Override
                            public void onClick(View v) {
                                if (CheckNet()) {
                                    offline.dismiss();
                                }
                            }
                        });

                    }
                    else {
                        //User became online (dismiss offline dialog):
                        if (offline.isShowing()) {
                            offline.dismiss();
                        }
                    }
                }
            };
            registerReceiver(netStateReceiver, new IntentFilter(Values.CONNECTIVITY_RECEIVER_ACTION));
        }
        super.onResume();
    }
}

使其成为对对话框对象引用的全局访问:

final Dialog offline = new Dialog(context, android.R.style.Theme_Light);

然后您将能够关闭对话框。

您将在每次广播中创建一个新对话框,而不是使用以前创建的对话框

使对话框变量成为activity类的成员变量,那么它就可以工作了

private Dialog offline;

@Override
protected void onResume() {
    if (netStateReceiver == null) {
        netStateReceiver = new BroadcastReceiver() {
            @Override
        public void onReceive(final Context context, Intent intent) {

            if (!CheckNet()) {
                if(offline==null || !offline.isShowing()){
                    offline = new Dialog(context, android.R.style.Theme_Light);
                }
                ...
            } else {
                //User became online (dismiss offline dialog):
                if (offline!=null && offline.isShowing()) {
                    offline.dismiss();
                }
            }

我需要onReceive方法的上下文对象,所以我无法在onReceive之外初始化对话框block@Masoud您可以在onCreate()方法中启动dialog对象。