【问题标题】:How to achieve dialogue box get disappeared when internet or WiFi get connected. and vice versa?连接互联网或WiFi时如何实现对话框消失。反之亦然?
【发布时间】:2019-06-05 05:32:04
【问题描述】:

我为我的 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;
    } 

【问题讨论】:

  • 对于这个问题当我在对话框外点击时对话框消失。你可以使用builder.setCancelable(false);
  • 您的两点都需要使用广播接收器进行网络连接。您在其中获得网络连接状态 CONNECTEDDISCONNECTED

标签: java android android-alertdialog android-connectivitymanager


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    把这一行从警告对话框代码中去掉

    alertDialog.setCancelable(false);
    

    【讨论】:

    • 谢谢。你能给我第二个和第三个查询的解决方案吗?
    【解决方案3】:

    要自动获取 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);
        }
    }
    

    然后您在 Activity 或 Fragment 中注册监听器

    @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
            }
        }
    

    【讨论】:

      【解决方案4】:

      您必须 setCancelable == false 才能在对话框之外停止触摸。

      在你的情况下,你必须在 AlertDialog.Builder 之后的 setMessage

      builder.setCancelable(false);

      并为用户在 Backpress 按钮上使用此功能您必须 setCancelable == true

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

      builder.setCancelable(true);

      【讨论】:

        【解决方案5】:

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

        那么你需要保持 builder 的全局性。

        private AlertDialog.Builder builder;
        

        【讨论】:

          【解决方案6】:

          只需创建一个 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();
              }
          

          每当互联网连接发生变化时,BroadcastReceiver 都会调用 onReceive 方法。

          希望对你有所帮助...

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-11-02
            • 1970-01-01
            • 2012-06-14
            • 2018-02-02
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多