36

FragmentActivity サポート v4 クラスがあり、2 つのサイド バイ サイド (gmail のような) フラグメントと、DialogFragment を表示できるボタンを実装しています。

オリエンテーションを変更しない限り、これはすべてうまく機能します。向きを変更すると、フラグメントの状態が保存されません。

そして、主な問題は、 FragmentDialog を開いていると、単に消えてしまうことです。

すべてのフラグメントを設定setRetainInstance(true);しましたが、役に立ちませんでした。

私のマニフェストに含めましandroid:configChanges="orientation"たが、それでも役に立ちません。

これが私のコードサンプルです。助けてくれてありがとう。

public class AddMasterDialog extends DialogFragment {

    private int mTitle;
    private int mPrompt;
    private OnClickListener onSaveListener;
    private OnClickListener onCancelListener;

    public AddMasterDialog newInstance(int title, int prompt) {
        AddMasterDialog simpleDialog = new AddMasterDialog(title, prompt);
        return simpleDialog;
    }

    public AddMasterDialog() {
        // Empty constructor required for DialogFragment
    }
    public AddMasterDialog(int title, int prompt) {
        // Empty constructor required for DialogFragment
        mTitle = title;
        mPrompt = prompt;
    }
    public void setSaveButton(OnClickListener save){
        onSaveListener = save;
    }
    public void setCancelButton(OnClickListener cancel){
        onCancelListener = cancel;
    }
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setRetainInstance(true);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {

        //if(savedInstanceState == null){
            View view = inflater.inflate(R.layout.add_new_simple, container);
            getDialog().setTitle(mTitle);
            ((TextView) view.findViewById(R.id.add_simple_new_value_prompt)).setText(mPrompt);

            Button saveButton = (Button) view.findViewById(R.id.add_simple_save_button);
            saveButton.setOnClickListener(onSaveListener);

            //Cancel Button
            Button cancelButton = (Button) view.findViewById(R.id.add_simple_cancel_button);
            cancelButton.setOnClickListener(onCancelListener);
            return view;
        //}
    }
}

そして私の主な活動では:

private void initiateAddMasterPopupWindow() {
        try {
            addMasterDialog = new AddMasterDialog(R.string.add_new_master_dialog_title, R.string.add_master_new_value_prompt);
            addMasterDialog.setSaveButton(saveNewMasterClickListener);
            addMasterDialog.setCancelButton(cancelNewMasterClickListener);
            FragmentManager fm = getSupportFragmentManager();
            addMasterDialog.show(fm, ADD_NEW_MASTER);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
4

4 に答える 4

75

さて、問題はDialogFragment互換性ライブラリにあるようです。

この問題はこの投稿で説明されています。

「フラグメントの廃止されたDISMISSメッセージは、メッセージキューに保持されます。DialogFragment.onDestroyView()古いダイアログを閉じるときにキューに入れられ、新しいダイアログの作成後に再度アクティブになります。

迅速な(そしておそらく汚い)回避策は、 「」onDestroyView()を呼び出す前に、却下リスナーをオーバーライドしてクリアすることです。super.onDestroyView()

DialogFragmentに次のコードを追加すると、問題が解決しました。

 @Override
 public void onDestroyView() {
     if (getDialog() != null && getRetainInstance()) {
         getDialog().setDismissMessage(null);
     }
     super.onDestroyView();
 }
于 2012-09-15T02:26:04.900 に答える
13

さまざまな理由で同じ問題を抱えている貧しい魂 (私) のために、これを投稿します。ダイアログ フラグメントは、次の操作を行っている限り、自動的に保持されます。

  1. を呼び出す場合はActivity onSaveInstanceState()必ずスーパー関数を呼び出してください!!!! . 私の場合、それが鍵でした。また、フラグメントでも同じことを行うようにしてください。
  2. を使用する場合はsetRetainInstance、手動で値を保存して再適用する必要があります。それ以外の場合は、ほとんどの場合、心配する必要はありません。もう少し複雑なことをしている場合は、 が必要になるかもしれませんがsetRetainInstance(true)、それ以外の場合は無視してください。私の場合、クラスの 1 つのランダム シードを格納するためにそれを使用する必要がありましたが、それ以外は問題ありませんでした。
  3. 一部の人々は、サポート ライブラリのバグについて不満を述べており、却下メッセージが送信されるべきではない場合に送信されます。最新のサポート ライブラリでは修正されているようですので、心配する必要はありません。

手動でフラグメントを保存するような特別なことをする必要はありません。これらの手順に従えば、自動的に行われます。全体として、これは、より最新のサポート ライブラリを使用している人にとってはうまくいくようです。

于 2013-12-31T11:27:13.187 に答える
2

私の場合、使用して別のDialogFragmentを示すDialogFragmentがありました

listDialogFragment.show(getChildFragmentManager(), "TAG");

それをに変更する

listDialogFragment.show(getActivity().getSupportFragmentManager(), "TAG");

問題を修正しました

于 2014-11-25T17:32:05.843 に答える