Android 在活动处于后台时关闭DialogFragment(支持库)gets IllegalStateException
在我的应用程序的活动中,我需要在上传内容时显示一个“加载”不可取消的片段对话框。我在当前活动中通过回调显示此对话框,如下所示:Android 在活动处于后台时关闭DialogFragment(支持库)gets IllegalStateException,android,android-fragments,dismiss,illegalstateexception,android-dialogfragment,Android,Android Fragments,Dismiss,Illegalstateexception,Android Dialogfragment,在我的应用程序的活动中,我需要在上传内容时显示一个“加载”不可取消的片段对话框。我在当前活动中通过回调显示此对话框,如下所示: final FragmentManager fm = getSupportFragmentManager(); final FragmentTransaction ft = fm.beginTransaction(); final Fragment prev = fm.findFragmentByTag( "loading" ); if ( prev != null )
final FragmentManager fm = getSupportFragmentManager();
final FragmentTransaction ft = fm.beginTransaction();
final Fragment prev = fm.findFragmentByTag( "loading" );
if ( prev != null ) {
ft.remove(prev);
}
ft.addToBackStack(null);
final DialogFragment df =
IndeterminateProgressDialogFragment.newInstance(
getString( R.string.loading_dialog_sending_data ) );
df.setCancelable( false );
df.show( ft, "loading" );
上载发生在从我的ui片段执行的保留片段(使用asynctask)中。上传完成后,onActivityResult会通知我的ui片段,目前它会尝试关闭对话框。在过去,它通过在onActivityResult上执行回调来解除加载对话框的责任,但它也不起作用
当我的活动在前台时,我可以关闭此对话框,但当我在后台时,我得到一个非法状态异常:OnSaveInstanceEstate后无法执行此操作。我尝试使用onRemove,这不会使我的应用程序崩溃,但也不会隐藏DialogFragment。我已经在我的ui片段和我的活动上做了这两件事,但问题仍然存在
我一直在阅读文档,但找不到可以使用的方法
DialogFragment不应该像我需要的那样使用吗?或者我应该怎么做?我只是设法用一个肮脏的解决方法来解决这个问题: 我捕获了IllegalStateException并将一个标志设置为true,因此当我的片段返回时,我知道我试图忽略它
//All this code is inside my ui Fragment
@Override
public void onResume() {
super.onResume();
final boolean kill = getArguments().getBoolean(ARG_KILL_LOADING, false);
if ( kill ) {
final DialogFragment df = ( DialogFragment )
getFragmentManager().findFragmentByTag( "loading" );
if ( df != null ) {
df.dismiss();
}
}
}
//Here I got workerfragment result and try to dismiss my DialogFragment
@Override
public void onActivityResult( int requestCode, int resultCode, Intent data ) {
super.onActivityResult(requestCode, resultCode, data);
try {
final DialogFragment df = ( DialogFragment ) getFragmentManager().findFragmentByTag( "loading" );
if ( df != null ) {
df.dismiss(); //Let's throw an IllegalStateException if on background!
}
} catch( IllegalStateException ex ) {
//dirty way to avoid crashing while on background:
//we will ask our ui fragment to dismiss df when ui fragment comes back onResume
getArguments().putBoolean(ARG_KILL_LOADING, true);
}
//Do something on ui with workerfragment result
}
但我仍然想知道,在后台时,什么是消除碎片对话框的正确方法。我得到了另一个有同样问题的项目:/您不需要在onActivityResult中消除片段并捕获异常 只需在ActivityResult中设置您的标志。我使用静态变量
public class MyFragment extends DialogFragment {
private static boolean KILL_FLAG = false;
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
KILL_FLAG = false;
}
@Override
public void onActivityResult(int requestCode, int resultCode,
Intent data) {
KILL_FLAG = true;
}
@Override
public void onResume() {
super.onResume();
if(KILL_FLAG){
dismiss();
}
}
}
但是,我的片段对话框应该是我保留的片段(在后台执行任务的片段)的目标,我的对话框将把结果传递给我的ui片段。我说的对吗?您这样做只是为了显示等待\加载对话框吗?为什么要使用onActivityResult?我说得对吗?是的。使用onActivityResult,我从我的工作者片段中获得结果,这样我就可以知道上传是否成功。