4

追加しようとしています

fragmentTransaction.hide(myDialogFragment);
fragmentTransaction.addToBackStack(null);

FragmentTransactionに追加して、ユーザーが戻るボタンを押したときにダイアログが再表示されるようにしますが、機能していません。私は元々 DialogFragment で onCreateDialog をオーバーライドしましたが、 FragmentTransaction の非表示呼び出しのドキュメントに次のように記載されていることに気付きました。

これは、ビューがコンテナーに追加されたフラグメントにのみ関係します。

その代わりに、今は onCreateView をオーバーライドしています。今では隠れていますが、実際にはそうではありません。ダイアログはしぼむだけですが、ウィンドウはまだ暗いままです。それを取り除くには戻るボタンを押す必要がありますが、これは明らかに私が望んでいる動作ではありません。ここで何が欠けていますか?

4

3 に答える 3

9

は、ダイアログを内部的DialogFragmentに維持し、それ自体のライフサイクルに従って、ダイアログの show メソッドと hide メソッドを呼び出します。呼び出しFragmentTransaction.hide()は、 によって返されるフラグメントのビューの可視性Fragment.onCreateView()を View.GONE に設定しようとするだけです。DialogFragment のビューは、偶然にもその内部ダイアログに使用されるビューであるため、ダイアログのコンテンツを非表示にしています。残念ながら、ビューを非表示にしてもダイアログが「閉じられる」わけではないため、画面は引き続き淡色表示されます。

を呼び出すDialogFragment.show(FragmentTransaction,String)と、FragmentTransactionが作成され、 に追加されFragmentManagerます。通常、ダイアログを表示することは「アクティブな」トランザクションと見なされ、それを閉じることはバック スタックを適切な回数だけポップすることです。間に他のフラグメントを追加しなかった場合は、削除操作で新しい FragmentTransaction が作成されます。これにアクセスできれば、バックスタック エントリを追加して、この操作を元に戻すことができます。残念ながら、これは不可能なので、私たちにできる最善の方法は、独自の却下メソッドを作成することです (内部状態がめちゃくちゃにならないように願っています)。

public class UndoDialogFragmentActivity extends FragmentActivity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        Button button = (Button) findViewById(R.id.button);
        button.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                // show a dialog fragment in the normal way
                new MyDialogFragment().show(getSupportFragmentManager(), "dialog");
            }
        });
    }

    private static class MyDialogFragment extends DialogFragment {
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setStyle(STYLE_NO_TITLE, getTheme());
            // do not allow back button to dismiss dialog; confusing behaviour otherwise!
            setCancelable(false);
        }

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
            Button button = new Button(getActivity());
            button.setText("Dismiss");
            button.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    // pressing back after 'dismissing' the dialog will cause it to be added again
                    getFragmentManager().beginTransaction().remove(MyDialogFragment.this).addToBackStack(null).commit();
                }
            });

            return button;
        }
    }
}

フラグメント内のボタンをクリックすると、DialogFragment が開かれ、独自の閉じるボタンが表示されます。非表示を押した後、戻るキーを押して削除操作を元に戻すと、ダイアログを再度表示できます。バックキーでダイアログの表示と非表示の両方を許可すると、これによりやや疑わしい動作が発生しますが、詳細はアプリケーションに応じて決定できます。

于 2012-03-16T22:28:05.010 に答える
4

DialogFragment 内から呼び出して、DialogFragment のダイアログを非表示にすることができましたgetDialog().hide()

于 2012-09-18T22:07:47.963 に答える
1

API Level 11またはそれ以上を使用している場合は、dismiss()を、またはそれ自体DialogFragmentから呼び出すことができます。FragmentActivityDialogFragment

于 2013-09-04T13:12:16.193 に答える