DialogFragment#dismiss を呼ぶと、画面回転させなければダイアログ消滅に問題が起きないが、
画面回転が発生後、dismiss を呼ぶと以下のように落ちてしまう。
E/AndroidRuntime(22523): FATAL EXCEPTION: main
E/AndroidRuntime(22523): java.lang.NullPointerException
E/AndroidRuntime(22523): at android.app.DialogFragment.dismissInternal(DialogFragment.java:287)
E/AndroidRuntime(22523): at android.app.DialogFragment.dismiss(DialogFragment.java:258)
onDismiss(dialog) を呼べば良いらしいが、ProgressDialog を DialogFragment で表示させる場合、
画面回転した後には、呼んでもダイアログが残ってしまう。
素直に、DialogFragment から getDialog() で取得した ProgressDialog を dismiss すれば、
画面回転した後に、ダイアログを消すことができた。
ProgressDialog を表示する DialogFragment は、以下のように、、
import android.app.Dialog;
import android.app.DialogFragment;
import android.app.ProgressDialog;
import android.os.Bundle;
/**
* ProgressDialogFragment
*/
public class ProgressDialogFragment extends DialogFragment{
// Bundle でタイトル、メッセージ、プログレス最大値、を取得する為の Key
public final static String TITLE = "Title";
public final static String MESSAGE = "Message";
public final static String MAX = "Max";
private static ProgressDialog progressDialog;
// インスタンス生成は、必ずこれを使う。
public static ProgressDialogFragment newInstance(){
return new ProgressDialogFragment();
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState){
if (progressDialog != null) return progressDialog;
setCancelable(false);
progressDialog = new ProgressDialog(getActivity());
progressDialog.setTitle(getArguments().getString(TITLE));
progressDialog.setMessage(getArguments().getString(MESSAGE));
progressDialog.setIndeterminate(false);
progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
progressDialog.setMax(getArguments().getInt(MAX));
progressDialog.setProgress(0);
return progressDialog;
}
// ProgressDialog 値の更新
public void updateProgress(int value){
if (progressDialog != null) progressDialog.setProgress(value);
}
@Override
public Dialog getDialog(){
return progressDialog;
}
}
AsyncTask で、プログレス表示するケースでは、、、
onPreExecute で上記、ProgressDialogFragment を生成して表示する。
public class MyTask extends AsyncTask<String,Integer,Long>{
private Activity activity;
ProgressDialogFragment dialogFragment;
public MyTask(Activity activity){
this.activity = activity;
}
@Override
protected void onPreExecute(){
Bundle args = new Bundle();
args.putString(ProgressDialogFragment.TITLE, "Title");
args.putString(ProgressDialogFragment.MESSAGE, "Loading Data ...");
args.putInt(ProgressDialogFragment.MAX, 100);
dialogFragment = ProgressDialogFragment.newInstance();
dialogFragment.setArguments(args);
dialogFragment.show(activity.getFragmentManager(), "progress");
}
// doInBackground ...
@Override
protected void onProgressUpdate(Integer...values){
dialogFragment.updateProgress(values[0]);
}
// プログレス達したら、getDialog().dismiss() を実行
@Override
protected void onPostExecute(Long result){
dialogFragment.getDialog().dismiss();
}
}