Как добиться того, чтобы диалоговое окно исчезло, когда подключился интернет или WiFi. и наоборот? - PullRequest
1 голос
/ 05 июня 2019

Я строю диалоговое окно для моего приложения для 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 ]

1 голос
/ 05 июня 2019

Чтобы автоматически получать события подключения к Интернету, попробуйте настроить прослушиватель изменения сети. Вот образец:

/**
 * 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
        }
    }
1 голос
/ 05 июня 2019

Удалите эту строку из кода диалогового окна предупреждения

alertDialog.setCancelable(false);
1 голос
/ 05 июня 2019

Используйте свойства builder.setCancelable(false); в вашем ежедневнике

0 голосов
/ 05 июня 2019

Просто создайте 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

   <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.

Надеюсь, полезно для вас ...

0 голосов
/ 05 июня 2019

Вам необходимо добавить приемник Broadcast, чтобы получить статус подключения.

Тогда вам нужно сохранить глобальный сборщик.

private AlertDialog.Builder builder;
0 голосов
/ 05 июня 2019

Вы должны установитьCancelable == false, чтобы прекратить тонуть вне диалога.

В вашем случае вы должны поместить это в свой AlertDialog.Builder после setMessage

builder.setCancelable (ложь);

и используйте эту функцию для пользователя, который при нажатии кнопки Backpress должен установитьCancelable == true

для этого Вы должны написать код в onBackPressed так: -

builder.setCancelable (истина);

...