这个问题需要在Fragment中处理返回键(back button)的事件。我们需要重写onBackPressed()方法,判断当前的Fragment是否是HomeFragment,如果是的话,就将App退出。如果不是,则返回HomeFragment。
同时,我们还需要处理弹出DialogFragment时的返回键。同样地,在DialogFragment中重写onBackPressed()方法,并在里面调用dismiss()方法,即可达到和点击dialog外部一样的效果。
下面是代码示例:
public class HomeFragment extends Fragment {
// ...
@Override
public void onResume() {
super.onResume();
((AppCompatActivity) getActivity()).getSupportActionBar()
.setTitle(getString(R.string.home_fragment_title));
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
view.findViewById(R.id.btn_show_dialog).setOnClickListener(v -> {
DialogFragment dialogFragment = new MyDialogFragment();
dialogFragment.show(getChildFragmentManager(), "MyDialogFragment");
});
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
setHasOptionsMenu(true);
}
@Override
public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
inflater.inflate(R.menu.menu_home, menu);
}
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
if (item.getItemId() == R.id.action_settings) {
NavHostFragment.findNavController(this).navigate(R.id.action_homeFragment_to_settingsFragment);
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
public void onBackPressed() {
if (getActivity() != null && !getActivity().isFinishing()) {
new AlertDialog.Builder(getActivity())
.setTitle("Confirmation")
.setMessage("Are you sure you want to exit the app?")
.setPositiveButton(android.R.string.yes, (dialog, which) -> {
getActivity().finish();
})
.setNegativeButton(android.R.string.no, null)
.show();
}
}
}
public class MyDialogFragment extends DialogFragment {
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setCancelable(true);
}
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_dialog, container, false);
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
view.findViewById(R.id.btn_close_dialog).setOnClickListener(v -> {
dismiss();
});