Android 对话框片段和返回按钮
是否有可能截获Android 对话框片段和返回按钮,android,android-fragments,Android,Android Fragments,是否有可能截获对话框片段中的按键?对不起,这个天真的问题。。从不调用myFragmentActivity的onBackPressed 提前谢谢 if (imageFile.exists()) { ShowPicDialog newFragment = ShowPicDialog.newInstance(); FragmentTransaction ft = manager.beginTransaction(); Fr
对话框片段
中的按键?对不起,这个天真的问题。。从不调用myFragmentActivity
的onBackPressed
提前谢谢
if (imageFile.exists()) {
ShowPicDialog newFragment = ShowPicDialog.newInstance();
FragmentTransaction ft = manager.beginTransaction();
Fragment prev = manager.findFragmentByTag("picDialog");
if (prev != null) {
ft.remove(prev);
}
ft.addToBackStack("picDialog");
newFragment.getArguments().putString("path", imageFile.getAbsolutePath());
newFragment.show(ft, "picDialog");
}
抱歉,我添加了用于显示对话框的代码片段。很难说问题出在哪里,因为您没有发布任何代码。但我的第一个猜测是,您没有通过调用
FragmentTransaction
的addToBackStack
方法将DialogFragment添加到后堆栈中,您正在使用该方法将片段添加到活动中
Android文档页面中有一些例子,给出了一个示例
因为您正在显示一个对话框,所以创建的对话框将接收关键事件,而不是父活动。因此,在创建对话框片段时设置一个
Dialog.OnKeyListener
,并在对话框上调用setCancelable(false)
,以防止back键将其取消。然后,您可以在OnKeyListener
的onkey
方法中处理back键。使用back按钮处理DialogFragment的最佳方法:
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
return new Dialog(getActivity(), getTheme()){
@Override
public void onBackPressed() {
// On backpress, do your stuff here.
}
};
}
如果不使用构建器模式,则效果非常好。如果在对话框中使用生成器模式,则可以执行以下操作:
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
AlertDialog alertDialog = new AlertDialog.Builder(getContext())
.setTitle(...)
.setPositiveButton(...)
.setNegativeButton(...)
.setMessage(...)
.create();
alertDialog.setOnKeyListener((dialog, keyCode, event) -> {
if (keyCode == KeyEvent.KEYCODE_BACK
&& event.getAction() == KeyEvent.ACTION_UP) {
// TODO do the "back pressed" work here
return true;
}
return false;
});
return alertDialog;
}
这是通过模仿系统首先调用onBackPressed()
的方式来实现的(忽略跟踪和监听操作)。请参见您是在使用兼容性库,还是在蜂窝设备/仿真器上进行测试?我用更多信息更新了我的答案。简而言之,当您创建一个对话框时,它会创建一个新的活动,因此FragmentActivity不再接收关键事件。您需要在DialogFragment中设置对话框,以便它为您处理back键。您是指setCancelable
而不是isCancelable
?