我正在尝试添加一个
fragmentTransaction.hide(myDialogFragment);
fragmentTransaction.addToBackStack(null);
到FragmentTransaction这样当用户点击后退按钮时对话框将重新出现,但它不起作用。我最初在我的 DialogFragment 中覆盖了 onCreateDialog,但我注意到 hide 的文档调用 FragmentTransaction 状态:
This is only relevant for fragments whose views have been added to a container.
因此,现在我重写了 onCreateView。现在它有点隐藏,但不是真的。对话只是萎缩,但窗口仍然是黑暗的。我必须点击后退按钮才能摆脱它,这显然不是我想要的行为。我在这里缺少什么?
最佳答案
DialogFragment
在内部维护一个对话框,并根据其自身的生命周期调用其上的显示和隐藏方法。调用 FragmentTransaction.hide()
只是尝试将 fragment View 的可见性(由 Fragment.onCreateView()
返回)设置为 View.GONE。 DialogFragment 的 View 恰好是用于其内部对话框的 View ,因此您正在做的是隐藏对话框中的内容。遗憾的是,隐藏 View 不会“关闭”对话框,因此屏幕仍会变暗。
当您调用 DialogFragment.show(FragmentTransaction,String)
时,将创建一个 FragmentTransaction
以将其添加到 FragmentManager
。通常,显示对话框被认为是“Activity ”事务,然后关闭它只是弹出返回堆栈适当的次数。如果您没有在两者之间添加任何其他 fragment ,则会使用删除操作创建一个新的 FragmentTransaction。如果我们可以访问它,那么我们只需添加一个 backstack 条目并使该操作可逆。不幸的是,这是不可能的,所以我们能做的最好的就是制作我们自己的 dismiss 方法(并希望内部状态不要搞得太糟):
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;
}
}
}
单击 fragment 中的按钮将打开一个 DialogFragment,它有自己的关闭按钮。按关闭后,您可以通过按返回键再次显示对话框,撤消删除操作。当您允许返回键同时显示和隐藏对话框时,这会产生一些有问题的行为,但细节可以由您根据您的应用程序决定。
关于Android:FragmentTransaction 隐藏不适用于 DialogFragment,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9186086/