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