ADialogFragment
在内部维护一个对话框,并根据自己的生命周期在其上调用 show 和 hide 方法。调用FragmentTransaction.hide()
只是试图将片段视图的可见性设置Fragment.onCreateView()
为 View.GONE。DialogFragment 的视图恰好是用于其内部对话框的视图,因此您所做的就是隐藏对话框上的内容。不幸的是,隐藏视图并不会“关闭”对话框,因此屏幕仍然会变暗。
当您调用时DialogFragment.show(FragmentTransaction,String)
,FragmentTransaction
会创建 a 以将其添加到FragmentManager
. 通常,显示对话框被认为是“活动”事务,然后将其关闭只是将返回堆栈弹出适当的次数。如果您没有在其间添加任何其他片段,则使用删除操作创建一个新的 FragmentTransaction。如果我们可以访问它,那么我们可以添加一个 backstack 条目并使这个操作可逆。不幸的是,这是不可能的,所以我们能做的最好的就是制作我们自己的解除方法(并希望内部状态不会变得太糟):
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 打开,并带有自己的关闭按钮。按下关闭后,您可以通过按返回键再次显示对话框,撤消删除操作。当您允许后退键显示和隐藏对话框时,这会产生一些可疑的行为,但细节可以由您根据您的应用程序决定。