6

私が次のことを正しく行っているかどうか、誰かが見ることができますか?進行状況ダイアログを含むフラグメントがあり、方向スイッチ全体で機能する必要があります。私は現在このようにしています:

// I am using the compat libraries
import android.support.v4.app.DialogFragment;

public class ProgressDialogFragment extends DialogFragment {

    private ProgressDialog mProgressDialog = null;
    private int            mMax            = 100;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setStyle(DialogFragment.STYLE_NO_TITLE, 0);
        setRetainInstance(true);
    }

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        mProgressDialog = new ProgressDialog(getActivity());
        mProgressDialog.setTitle("Title");
        mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
        mProgressDialog.setCancelable(true);
        mProgressDialog.setProgress(0);
        mProgressDialog.setMax(mMax);
        mProgressDialog.setCanceledOnTouchOutside(false);

        return mProgressDialog;
    }

    // there seems to be a bug in the compat library - if I don't do the following - the dialog is not show after an orientation switch
    @Override
    public void onDestroyView() {
        if (getDialog() != null && getRetainInstance())
            getDialog().setDismissMessage(null);
        super.onDestroyView();
    }

    public void setMax(int arg1) {
        mProgressDialog.setMax(arg1);
        mMax = arg1;
    }

    public void setProgress(int arg1) {
        mProgressDialog.setProgress(arg1);
    }
}

私のアクティビティでは、このProgressDialogFragmentを作成し、ダイアログを表示する必要があるときにshow()を呼び出します。onCreateDialogメソッドでmProgressDialogがすでに存在する場合、単純に返すことができない理由を理解しようとしています(「コンテンツを追加する前にrequestFeature()を呼び出す必要がある」という例外が発生します)。確かに、フラグメントの使用法の1つは、これらの場合にリソースを再利用することです。既存のダイアログを使用する代わりに、新しいダイアログを作成する必要があるのはなぜですか。

4

1 に答える 1

2

古いコンテキスト、つまり破棄されているアクティビティへの参照があるため、onCreateDialogメソッドで古いダイアログを単純に渡すことはできません。

ダイアログを再作成しないと、メモリリークが発生します。

于 2013-01-07T20:19:48.373 に答える