我使用的是Android的支持库(V4)和ActionBarSherlock。 我试图关闭进度对话框编程。 我编写一个小工具类,以帮助对话管理。
对话框是从示出AsyncTask.onPreExecute
。 它得到正确显示。 然后我火通过旋转装置,其破坏活性的改变配置(调用的onDestroy AsyncTask.cancel(true)
)。 AsyncTask.onCancelled
被调用,在这个方法,其中我试图关闭对话框。 但没有任何反应。 下面是辅助功能显示和关闭对话框:
public abstract class DialogHelperActivity extends SherlockFragmentActivity {
protected void showProgressDialog(final String msg, final String tag){
FragmentTransaction ft = this.getSupportFragmentManager().beginTransaction();
DialogFragment dialogFragment = ProgressDialogFragment.newInstance(msg);
ft.add(dialogFragment, tag);
ft.disallowAddToBackStack();
ft.commitAllowingStateLoss(); //If I try with regular commit(), exceptions are thrown.
}
protected void closeDialog(final String tag){
FragmentManager fm = this.getSupportFragmentManager();
Fragment dialogFragment = fm.findFragmentByTag(tag);
if(dialogFragment != null){
FragmentTransaction ft = fm.beginTransaction();
ft.remove(dialogFragment);
ft.commitAllowingStateLoss();
} else {
System.err.println("dialog not found!"); //This line is hit always
}
}
public static class ProgressDialogFragment extends SherlockDialogFragment {
static ProgressDialogFragment newInstance(final String msg) {
ProgressDialogFragment adf = new ProgressDialogFragment();
Bundle bundle = new Bundle();
bundle.putString("alert-message", msg);
adf.setArguments(bundle);
return adf;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.setCancelable(false);
int style = DialogFragment.STYLE_NORMAL, theme = 0;
setStyle(style,theme);
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
Bundle bundle = this.getArguments();
String message = bundle.getString("alert-message");
ProgressDialog dialog = new ProgressDialog(getActivity());
if(message != null){
dialog.setMessage(message);
}
dialog.setCancelable(false);
dialog.setIndeterminate(true);
return dialog;
}
}
}
旋转设备后,的AsyncTask被取消。 我打电话closeDielog
从onPostExecute
,也从onCancelled
。 该对话永远不会被关闭,因为标签ID找不到( findFragmentByTag
返回null)。 我很困惑与此有关。 标记是我在执行活动的静态字符串,所以没有什么指望的调用之间丢失或改变showProgressDialog
和closeDialog
。
任何想法/提示/建议将非常感激。
谢谢。