互联网或WiFi连接后,如何实现对话框消失。反之亦然?

时间:2019-06-05 05:32:04

标签: java android android-alertdialog android-connectivitymanager

我为我的Android应用程序构建了对话框。它工作正常,但是我遇到了一些与对话框有关的问题。

(1)我想要在连接互联网或WiFi时。自动对话框消失。

(2)如果互联网连接丢失,则应用程序中间正在运行。对话框再次自动出现。

if (!isConnected(Dashboard.this)) buildDialog(Dashboard.this).show();
        else {
            setContentView(R.layout.activity_dashboard);
        }
 public boolean isConnected(Context context) {

        ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo netinfo = cm.getActiveNetworkInfo();

        if (netinfo != null && netinfo.isConnectedOrConnecting()) {
            android.net.NetworkInfo wifi = cm.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
            android.net.NetworkInfo mobile = cm.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);

            if ((mobile != null && mobile.isConnectedOrConnecting()) || (wifi != null && wifi.isConnectedOrConnecting()))
                return true;
            else return false;
        } else
            return false;
    }

    public AlertDialog.Builder buildDialog(Context c) {

        AlertDialog.Builder builder = new AlertDialog.Builder(c);
        builder.setTitle("No Internet Connection");
        builder.setMessage("You need to have Mobile Data or WiFi to access this. Press OK to Exit");
        builder.setCancelable(false);

        builder.setPositiveButton("Ok", new DialogInterface.OnClickListener() {

            @Override
            public void onClick(DialogInterface dialog, int which) {

                Dashboard.super.onBackPressed();
            }
        });

        return builder;
    } 

6 个答案:

答案 0 :(得分:1)

在aleart中使用属性builder.setCancelable(false);

答案 1 :(得分:1)

将此行放在警报对话框代码中

alertDialog.setCancelable(false);

答案 2 :(得分:1)

要自动获取Internet连接事件,请尝试设置网络更改监听器。这是一个示例:

/**
 * Broadcast receiver that detects receives notification when change in internet connection to alert when there is no Internet.
 */

public class NetworkChangeReceiver extends BroadcastReceiver {

    private NetworkChangeListener mListener;

    public NetworkChangeReceiver(NetworkChangeListener listener) {
        mListener = listener;
    }

    @Override
    public void onReceive(final Context context, @NonNull final Intent intent) {

        if (ConnectivityManager.CONNECTIVITY_ACTION.equals(intent.getAction())) {
            ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfo activeNetwork = connectivityManager.getActiveNetworkInfo();

            boolean connected = activeNetwork != null && activeNetwork.isConnected();
            mListener.onNetworkConnectedStateChanged(connected);
        }
    }

    public interface NetworkChangeListener {
        void onNetworkConnectedStateChanged(boolean connected);
    }
}

然后您在“活动”或“片段”中注册侦听器

@Override
    public void onStart() {
        super.onStart();

        if (mNetworkChangeReceiver == null) {
            mNetworkChangeReceiver = new NetworkChangeReceiver(this);
            getContext().registerReceiver(mNetworkChangeReceiver, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));
        }
    }

然后在网络连接状态更改时显示/关闭对话框

@Override
    public void onNetworkConnectedStateChanged(boolean connected) {
        if (connected) {
            //dismiss dialog
        } else {
            //show dialog
        }
    }

答案 3 :(得分:0)

您必须将setCancelable == false设置为停止在对话框外滚动。

在您的情况下,必须在setMessage

之后将其放在 AlertDialog.Builder

builder.setCancelable(false);

并将此功能用于“后按”按钮上的用户,您必须设置Cancelable == true

为此,您必须像这样在onBackPressed中编写代码:-

builder.setCancelable(true);

答案 4 :(得分:0)

您需要添加广播接收器以获取连接状态。

然后您需要使构建器保持全球化。

private AlertDialog.Builder builder;

答案 5 :(得分:0)

只需创建一个 BroadcastReceiver 来跟踪您的互联网连接

首先,创建一个像这样的 NetworkChangeReceiver

 public class NetworkChangeReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            try {
                if (isOnline(context)) {
                   //show dialog when internet on
                    dialogHome(true);

                    Log.e("pradeep", "Online Connect Internet ");
                } else {
                  //hide dialog when internet off
                    dialogHome(false);

                    Log.e("pradeep", "Connectivity Failure !!");
                }
            } catch (NullPointerException e) {
                e.printStackTrace();
                Log.i(getClass().getName(), "exceptional " + e.toString());
            }
        }

        public boolean isOnline(Context context) {
            try {
                ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
                NetworkInfo netInfo = cm.getActiveNetworkInfo();
                //should check null because in airplane mode it will be null
                return (netInfo != null && netInfo.isConnected());
            } catch (NullPointerException e) {
                e.printStackTrace();
                return false;
            }
        }
    }

之后,只需在 AndroidMenifest.xml

中的 application 标签中添加以下代码
   <receiver android:name=".utils.NetworkChangeReceiver">
        <intent-filter>
            <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
        </intent-filter>
    </receiver>

最后一步

只需在您检查互联网活动的活动中创建您的BroadcastReceiver实例

    private BroadcastReceiver mNetworkReceiver;

    @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_home);

         //init broadcast receiver
            mNetworkReceiver = new NetworkChangeReceiver();
        }

  @Override
    protected void onResume() {
        super.onResume();
        if (((NetworkChangeReceiver) mNetworkReceiver).isOnline(mContext)) {
        } else {
            registerNetworkBroadcastForNougat();
        }
    }

 private void registerNetworkBroadcastForNougat() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            try {
                registerReceiver(mNetworkReceiver, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));
            } catch (Exception e) {
                Log.i(getClass().getName(), "easdfdf" + e.toString());
            }
        }
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            try {
                registerReceiver(mNetworkReceiver, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));
            } catch (Exception e) {
                Log.i(getClass().getName(), "easdfdfdd" + e.toString());
            }
        }
    }

    protected void unregisterNetworkChanges() {
        try {
            unregisterReceiver(mNetworkReceiver);
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        unregisterNetworkChanges();
    }

每当Internet连接更改广播接收器onReceive方法时调用。

希望对您有帮助...