我有一个显示自定义对话片段的初始屏幕活动。 当我按回去时,我不仅想关闭对话框片段,还想关闭它包含活动。
DialogFragment缺少onBackPressed((,否则我会把
getActivity().finish()
在该回调中。 我也不想把它放在 onDetach(( 中,因为如果用户单击对话框片段中的元素,它应该在同一启动活动中填充列表视图,而不是关闭应用程序。
为什么要使用onDismiss
回调?喜欢这个:
@Override
public void onDismiss(DialogInterface dialog) {
super.onDismiss(dialog);
getActivity().finish();
}
或者覆盖活动中的onBackPressed
:
@Override
public void onBackPressed() {
MyFragment myFrag = getFragmentManager().findFragmentByTag("myFrag");
if (myFrag != null && myFrag.mDialog.isShowing())
myFrag.mDialog.dismiss();
finish();
} else {
super.onBackPressed();
}
}
public class ShadowDialog extends DialogFragment {
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
View view = getActivity().getLayoutInflater().inflate(R.layout.shadow_loader,null);
final Dialog dialog = new Dialog(getActivity()){
@Override
public void onBackPressed() {
super.onBackPressed();
getActivity().onBackPressed();
}
};
dialog.setContentView(view);
dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
dialog.getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
return dialog;
}
}
您可以尝试覆盖 onKeyDown(( 以检测 DialogFragment 中的后退按钮按下:
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
....
@Override
public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
Dialog dialog = new Dialog(requireContext()){
@Override
public void onBackPressed() {
super.onBackPressed();
requireActivity().finish();
// or requireActivity().onBackPressed();
}
};
return dialog;
}