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())) {
に供給するための正しいコンテキスト(問題がある場合)は何ですか?私はgetApplicationContext
、getBaseContext
、MainActivity.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
を呼び出して、接続がない場合、ダイアログを再表示されます。
私はこのアプローチを使用することができましたが、私が望むなら別の方法でダイアログを表示することはできません。
あなたはこのことを確認する必要がありますhttp://stackoverflow.com/questions/10641144/difference-between-getcontext-getapplicationcontext-getbasecontext-and –
'MainActivity.this'も渡すことができます。 –
'MainActivity.this'はどちらも動作しません – X09