Chr*_*rry 4 android android-fragments android-dialogfragment
我正在尝试添加一个
fragmentTransaction.hide(myDialogFragment);
fragmentTransaction.addToBackStack(null);
Run Code Online (Sandbox Code Playgroud)
到FragmentTransaction,以便当用户点击后退按钮时对话框将重新出现,但它不起作用.我最初在我的DialogFragment中覆盖了onCreateDialog,但我注意到FragmentTransaction上隐藏调用的文档说明:
这仅适用于已将视图添加到容器的片段.
所以相反,现在我重写onCreateView.现在它有点隐藏,但不是真的.对话框只是萎缩,但窗口仍然是黑暗的.我必须按下后退键才能摆脱它,这显然不是我想要的行为.我在这里错过了什么?
A DialogFragment在内部维护一个对话框,并根据自己的生命周期调用show和hide方法.调用FragmentTransaction.hide()只是尝试将片段视图的可见性设置Fragment.onCreateView()为View.GONE.DialogFragment的视图恰好是用于其内部对话框的视图,因此您正在做的是将内容隐藏在对话框中.不幸的是,隐藏视图不会"关闭"对话框,因此屏幕仍然会变暗.
当你打电话时DialogFragment.show(FragmentTransaction,String),FragmentTransaction会创建a来将其添加到FragmentManager.通常,显示对话框被视为"活动"事务,然后解除它只是弹出后端堆栈适当的次数.如果您之间没有添加任何其他片段,则会使用remove操作创建一个新的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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
单击片段中的按钮将导致打开DialogFragment,并带有自己的关闭按钮.按下解除后,您可以通过按后退键再次显示对话框,撤消删除操作.当您允许后退键显示和隐藏对话框时,这会产生一些有问题的行为,但细节可以由您根据您的应用程序决定.
| 归档时间: |
|
| 查看次数: |
7096 次 |
| 最近记录: |