DialogFragmentを作成してポップアップできるFragmentがありますが、[戻る]ボタンを押すと、明示的にsetCancelable(false)を呼び出してもダイアログが閉じられます。 DialogFragmentが[戻る]ボタンの影響を受けないようにする方法はありますか?
public class LoadingDialogFragment extends DialogFragment
{
String title;
String msg;
public LoadingDialogFragment()
{
this.title = "Loading...";
this.msg = "Please wait...";
}
public LoadingDialogFragment(String title, String msg)
{
this.title = title;
this.msg = msg;
}
@Override
public Dialog onCreateDialog(final Bundle savedInstanceState)
{
final ProgressDialog dialog = new ProgressDialog(getActivity());
dialog.setTitle(title);
dialog.setMessage(msg);
dialog.setIndeterminate(true);
dialog.setCanceledOnTouchOutside(false);
dialog.setCancelable(false);
return dialog;
}
}
AsyncTaskからDialogFragmentを作成します。
private class GpsTask extends AsyncTask<String, Integer, Integer>
{
//ProgressDialog dialog;
@Override
protected void onPreExecute()
{
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
DialogFragment newFragment = new LoadingDialogFragment("Gathering Location", "Acquiring GPS lock...");
ft.addToBackStack(null);
newFragment.show(ft, "dialog");
}
@Override
protected Integer doInBackground(String... params)
{
//acquire a GPS lock and grab a few position updates
}
@Override
protected void onProgressUpdate(Integer... input) { }
@Override
protected void onPostExecute(Integer result)
{
getSupportFragmentManager().popBackStackImmediate();
}
}
setCancelable
を使用してはどうですか?試しましたか?
ドキュメントから-
表示されたダイアログがキャンセル可能かどうかを制御します。 DialogFragmentはこれに基づいて動作を変更する必要があるため、Dialog.setCancelable(boolean)を直接呼び出す代わりにこれを使用します。
これがFragmentDialogsで機能するかどうかはわかりませんが、setCancelableが機能しない場合は、この記事を見る価値があるかもしれません: Android:Prompt user [戻る]ボタンが押されたときに変更を保存するには
戻るボタンが押されたことを検出する方法を説明します。それで、あなたはボタンを押すことを抑えることができ、ダイアログが閉じるのを止めることができますか?
あなたを助けるかもしれません。
newFragment.setCancelable(false);
dialogFragmentオブジェクトを作成するとき、または以下のサンプルのようにカスタムDialogFragmentのコンストラクターで上記のような変更を行います。
public static CustomClearHourDialog newInstance(Bundle args, IDialogListener listener)
{
CustomClearHourDialog clearHourDialog = new CustomClearHourDialog();
CustomClearHourDialog.listener = listener;
clearHourDialog.setCancelable(false);
return clearHourDialog;
}