2016-04-16 12 views
0

accepted answer to this questionから、自分のアクティビティで何回も使用できるAlertDialogを構築しますが、ポジティブボタンに問題があります。負のボタンはかなり大丈夫働いているAlertDialogのボタンを機能させる正しいコンテキストを提供する方法

MainActivity

public class MainActivity extends AppCompatActivity { 

    private final String TAG = "MainActivity"; 
    private AlertDialog internetDialog; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     //The usuals 
     Log.d(TAG, "onCreate called"); 

     internetDialog = new AlertDialog.Builder(MainActivity.this) 
       .setTitle(R.string.alert_titl) 
       .setCancelable(false) 
       .setIcon(R.mipmap.ic_launcher) 
       .setMessage(R.string.alert_mess) 
       .setPositiveButton(R.string.alert_retry, new DialogInterface.OnClickListener() { 
        @Override 
        public void onClick(DialogInterface dialog, int which) { 
         if (!NetworkCheck.isAvailableAndConnected(getApplicationContext())) { 
          internetDialog.show(); 
         } else { 
          getData(); 
         } 

        } 
       }) 
       .setNegativeButton(R.string.alert_cancel, new DialogInterface.OnClickListener() { 
        @Override 
        public void onClick(DialogInterface dialog, int which) { 
         finish(); 

        } 
       }) 
       .create(); 



     if (NetworkCheck.isAvailableAndConnected(this)) { 

       getData(); 

       } else { 
        internetDialog.show(); 
       } 
      } 


    //This method will get data from the web api 

    private void getData(){ 


     Log.d(TAG, "getData called"); 
     //Showing progress dialog 
     mProgressDialog = new ProgressDialog(MainActivity.this); 
     mProgressDialog.setCancelable(false); 
     mProgressDialog.setMessage(this.getResources().getString(R.string.load_post)); 
     mProgressDialog.show(); 


     //Creating a json request 
     JsonArrayRequest jsonArrayRequest = new JsonArrayRequest(ConfigPost.GET_URL, 
       new Response.Listener<JSONArray>() { 
        @Override 
        public void onResponse(JSONArray response) { 
         Log.d(TAG, "onResponse called"); 
         //Dismissing the progress dialog 
         if (mProgressDialog != null) { 
          mProgressDialog.hide(); 
         } 
         /*progressDialog.dismiss();*/ 


         //calling method to parse json array 
         parseData(response); 

        } 
       }, 
       new Response.ErrorListener() { 
        @Override 
        public void onErrorResponse(VolleyError error) { 
         if (mProgressDialog != null) { 
          mProgressDialog.hide(); 
         } 

        } 
       }); 

     //Creating request queue 
     RequestQueue requestQueue = Volley.newRequestQueue(this); 

     //Adding request to the queue 
     requestQueue.add(jsonArrayRequest); 

    } 

NetworkCheck

public class NetworkCheck { 

    public static boolean isAvailableAndConnected(Context context) { 
     ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
     boolean isNetworkAvailable = cm.getActiveNetworkInfo() != null; 
     boolean isNetWorkConnected = isNetworkAvailable && cm.getActiveNetworkInfo().isConnected(); 

     return isNetWorkConnected; 

    } 

} 

しかし: は、以下のコードで(!NetworkCheck.isAvailableAndConnected(getApplicationContext())) { 行目に右のコンテキストを提供しようとしていますポジティブボタンはダイアログを閉じるだけで成功します。 getDataが呼び出されていない場合(インターネットに接続されている場合)、再度表示されるダイアログも表示されません(インターネットに接続されていない場合)。 ポジティブボタンを動作させるために(!NetworkCheck.isAvailableAndConnected(getApplicationContext())) {に供給するための正しいコンテキスト(問題がある場合)は何ですか?私はgetApplicationContextgetBaseContextMainActivity.thisを試しましたが、うまくいかなかった。

私はこれを行う場合:

if (NetworkCheck.isAvailableAndConnected(this)) { 

      //Caling method to get data 
      getData(); 
     } else { 
      final Context mContext; 
      mContext = this; 
      final AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this); 
      alertDialogBuilder.setTitle(R.string.alert_titl); 
      alertDialogBuilder.setCancelable(false); 
      alertDialogBuilder.setIcon(R.mipmap.ic_launcher); 
      alertDialogBuilder.setMessage(R.string.alert_mess); 
      alertDialogBuilder.setPositiveButton(R.string.alert_retry, new DialogInterface.OnClickListener() { 
       @Override 
       public void onClick(DialogInterface dialog, int which) { 
        if (!NetworkCheck.isAvailableAndConnected(mContext)) { 
         alertDialogBuilder.show(); 
        } else { 
         getData(); 
        } 


       } 
      }); 
      alertDialogBuilder.setNegativeButton(R.string.alert_cancel, new DialogInterface.OnClickListener() { 
       @Override 
       public void onClick(DialogInterface dialog, int which) { 
        finish(); 

       } 
      }); 
      alertDialogBuilder.show(); 

     } 

をインターネット接続がある場合は、再試行ボタンをgetDataを呼び出して、接続がない場合、ダイアログを再表示されます。

私はこのアプローチを使用することができましたが、私が望むなら別の方法でダイアログを表示することはできません。

+0

あなたはこのことを確認する必要がありますhttp://stackoverflow.com/questions/10641144/difference-between-getcontext-getapplicationcontext-getbasecontext-and –

+0

'MainActivity.this'も渡すことができます。 –

+0

'MainActivity.this'はどちらも動作しません – X09

答えて

1

この2行をマニフェストファイルに追加していただきたいと思います。私はまだコメントする権限を持っていないよう

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission> 
<uses-permission android:name="android.permission.INTERNET"></uses-permission> 

[OK]を、私は確かにあなたの問題を解決する答えsection.Below答えでそれを書いて、それを試してください。

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    //The usuals 
    Log.d(TAG, "onCreate called"); 

    showDialog(); 


    if (NetworkCheck.isAvailableAndConnected(MainActivity.this)) { 

     getData(); 

    } else { 
     internetDialog.show(); 
    } 

} 

private void showDialog() { 
    internetDialog = new AlertDialog.Builder(MainActivity.this) 
      .setTitle(R.string.alert_titl) 
      .setCancelable(false) 
      .setIcon(R.mipmap.ic_launcher) 
      .setMessage(R.string.alert_mess) 
      .setPositiveButton(R.string.alert_retry, new DialogInterface.OnClickListener() { 
       @Override 
       public void onClick(DialogInterface dialog, int which) { 
        if (!NetworkCheck.isAvailableAndConnected(MainActivity.this)) { 
         if (internetDialog != null && internetDialog.isShowing()) { 
          internetDialog.dismiss(); 
          internetDialog = null; 
          showDialog(); 
          internetDialog.show(); 
         } 
        } else { 
         getData(); 
        } 

       } 
      }) 
      .setNegativeButton(R.string.alert_cancel, new DialogInterface.OnClickListener() { 
       @Override 
       public void onClick(DialogInterface dialog, int which) { 
        finish(); 

       } 
      }) 
      .create(); 


} 

//This method will get data from the web api 

private void getData(){ 


    Log.d(TAG, "getData called"); 
    //Showing progress dialog 
    mProgressDialog = new ProgressDialog(MainActivity.this); 
    mProgressDialog.setCancelable(false); 
    mProgressDialog.setMessage(this.getResources().getString(R.string.load_post)); 
    mProgressDialog.show(); 


    //Creating a json request 
    JsonArrayRequest jsonArrayRequest = new JsonArrayRequest(ConfigPost.GET_URL, 
      new Response.Listener<JSONArray>() { 
       @Override 
       public void onResponse(JSONArray response) { 
        Log.d(TAG, "onResponse called"); 
        //Dismissing the progress dialog 
        if (mProgressDialog != null) { 
         mProgressDialog.hide(); 
        } 
        /*progressDialog.dismiss();*/ 


        //calling method to parse json array 
        parseData(response); 

       } 
      }, 
      new Response.ErrorListener() { 
       @Override 
       public void onErrorResponse(VolleyError error) { 
        if (mProgressDialog != null) { 
         mProgressDialog.hide(); 
        } 

       } 
      }); 

    //Creating request queue 
    RequestQueue requestQueue = Volley.newRequestQueue(this); 

    //Adding request to the queue 
    requestQueue.add(jsonArrayRequest); 

} 
+0

もちろん私は持っている;アプリはそれ以外の場合はクラッシュします。 – X09

+0

あなたの問題が解決したら幸いです。 – Drv

+0

ありがとうございますが、あなたの答えは2つのダイアログを実装しており、私はそれを避けたいと思いました。私は質問 – X09

0

私はコメントできませんので、回答に追加する必要があります。 コンテストに間違いがないと、getBaseContext()を使用することができます。あなたの場合、getdata()はあなたのインターネットが接続されている場合にのみ呼び出すことができます。インターネットに接続して試してみて、今すぐgetdata()を呼び出すべきポジティブボタンをクリックしてください。私はそれが正常に動作していることを確認しました。私が前提としていたのは、インターネットがまだ切断されている場合に、ボタンをクリックしてダイアログを閉じるのを防ぎたいということです。基準は少し異なります。

あなたは詳細な回答、以下を見ても、この

AlertDialog.Builder builder = new AlertDialog.Builder(this); 
     builder.setMessage("Message"); 
     builder.setPositiveButton("OK", 
       new DialogInterface.OnClickListener() 
       { 
        @Override 
        public void onClick(DialogInterface dialog, int which) 
        { 
         //Do nothing here because we override this button later to change the close behaviour. 
         //However, we still need this because on older versions of Android unless we 
         //pass a handler the button doesn't get instantiated 
        } 
       }).setNegativeButton("Cancel", new DialogInterface.OnClickListener() { 
      @Override 
      public void onClick(DialogInterface dialog, int which) { 
       finish(); 
      } 
     }); 

     internetDialog = builder.create(); 
     internetDialog.show(); 
     internetDialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener(new View.OnClickListener() 
     { 
      @Override 
      public void onClick(View v) 
      { 
       boolean test = NetworkCheck.isAvailableAndConnected(getBaseContext()); 
         if (test) { 
          getData(); 
          internetDialog.dismiss(); 
         } 
       //else dialog stays open. Make sure you have an obvious way to close the dialog especially if you set cancellable to false. 
      } 
     }); 
enter code here 

にコードを変更し

https://stackoverflow.com/a/15619098/4381591 以上のカスタムダイアログを使用する。 https://stackoverflow.com/a/4016574/4381591 :)

+0

いいえ、ポジティブボタンをクリックするとダイアログが消えるようにします。クリックされてインターネットに接続されている場合は、getdata()を呼び出す必要があります。今、私を手に入れますか?問題は、接続がないことを示すことを拒否しただけで、ダイアログを破棄したということです。 – X09

+0

あなたはsoggerの回答の最初のリンクを見ているかもしれません。 「自分自身をもう一度見せてください」はあなたが間違っていることです。私は2つのリンクを1つの警告ダイアログのデフォルトの動作を管理するためのカスタムダイアログを表示したり、再び表示を保つために与えた: –

+0

@Ozufは私の編集答えを見て:) 私はテストし、それはうまくいきます。 –

関連する問題