2017-09-14 1 views
0

これはクラスactivityを拡張する基本アクティビティです。ユーザがオフラインになったときにダイアログを表示し、ユーザがオンラインになったときに閉じる(broadcastReceiverで)

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()); 
} 
} 

あなたは、私が接続状態をチェックするための受信機を登録しているコードで見たよう:私は私の他の活動は、この基本クラスを拡張します。

ユーザーがオフラインになったときにユーザーにダイアログが表示され、彼がオフラインであることを通知して、オンラインになって続行する必要があります。この部分はうまくいく。

また、このダイアログが表示され、ユーザーがオンラインになったときにこのダイアログは閉じられますが、この部分は機能せず、ダイアログは表示されたままになります。

問題は何ですか。どのようにダイアログを閉じることができますか?

答えて

1

以前に作成したダイアログを使用する代わりに、すべてのブロードキャストで新しいダイアログを作成します。

ダイアログ変数をアクティビティクラスのメンバ変数にして、それが動作するはずです。

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(); 
       } 
      } 
+0

正しく動作します。ありがとうございます。 – Masoud

0

ブロードキャストを受信するたびに新しいダイアログを作成しているため、「あなたは現在オフラインです」と表示されたダイアログとは全く異なるダイアログが表示されます。

onReceiveコールバックではなく、アクティビティに「オフライン」ダイアログを表示してください。

簡単な例は次のようになります。そして、あなたは、ダイアログを閉じることができるでしょう

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

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(); 
    } 
} 
0

すると、ダイアログオブジェクト参照へのグローバルアクセスしてください。

+0

私はonReceiveメソッドのコンテキストオブジェクトを必要とするので、私はあなたのonCreate()メソッドでダイアログオブジェクトを開始onReceiveブロック – Masoud

+0

@Masoudのうちのダイアログを初期化することはできません。 – james

関連する問題