3

私のアプリのアクティビティでは、何かがアップロードされている間、「読み込み中」のキャンセルできない FragmentDialog を表示する必要があります。次のように、現在のアクティビティのコールバックからこのダイアログを表示します。

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 を使用) で行われています。アップロードが完了すると、私の ui Fragment は onActivityResult で通知され、現在、ダイアログを閉じようとしています。以前は、onActivityResult でコールバックを実行して読み込みダイアログを閉じる責任を委任していましたが、これも機能しません。

アクティビティがフォアグラウンドにある間はこのダイアログを閉じることができますが、バックグラウンドにあるときは IllegalStateException: can't perform this action after onSaveInstaneState. が発生します。onRemove を使用してみましたが、アプリがクラッシュすることはありませんが、DialogFragment も非表示になりません。私はUIフラグメントとアクティビティの両方を実行しましたが、まだ問題があります。

ドキュメントを読んでいますが、使用できる方法が見つかりません。

DialogFragment は、必要なように使用することは想定されていませんか、それともどうすればよいですか?

4

2 に答える 2

2

私は汚い回避策でこれを解決することができました:

IllegalStateException をキャッチし、フラグを true に設定したので、Fragment が戻ってきたときに、破棄しようとしたことがわかります。

//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

}

しかし、onBackground で FragmentDialog を閉じる正しい方法は何なのか、まだ疑問に思っています。同じ問題を抱えた別のプロジェクトを手に入れました:/

于 2011-11-25T00:22:59.637 に答える
2

onActivityResult でフラグメントを破棄して例外をキャッチする必要はありません。

onActivityResult でフラグを設定するだけです。静的変数を使用します。

    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();
                }
            }
    }
于 2012-02-04T15:32:19.417 に答える