Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to show warning message when back button is pressed in fragments

I want application to show warning message when user press back button and if user select Yes it will go back. And i am in navigation graph fragment.

I have searched many time in stack Overflow and tried:

@Override
public void onBackPressed() {
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());

    builder.setTitle("Save Or Not");
    builder.setMessage("Do you want to save this? ");
    builder.setPositiveButton("Save", new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int id) {
            /*Go back:-I dont know how*/
        }
    });
    builder.setNegativeButton("Discard",null);
    builder.show();
}

But it is showing giver error: Method does not override method from its superclass

Edit: I want to set onBackPressedListener(Mobiles back button) in Navigation graphs fragment

like image 678
Aradhya Gopal Nepal Avatar asked Jan 26 '23 06:01

Aradhya Gopal Nepal


2 Answers

When using Fragments 1.1.0 (which is in alpha right now), you can follow the Provide custom back navigation documentation, which shows how to register an OnBackPressedCallback, which allows you to register for onBackPressed() callbacks from within a Fragment:

public class MyFragment extends Fragment {

  @Override
  public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // This callback will only be called when MyFragment is at least Started.
    OnBackPressedCallback callback = new OnBackPressedCallback(true /* enabled by default */) {
        @Override
        public void handleOnBackPressed() {
            AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());

            builder.setTitle("Save Or Not");
            builder.setMessage("Do you want to save this? ");
            builder.setPositiveButton("Save", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int id) {
                // Save your content
                save();
                // Then pop
                NavHostFragment.findNavController(MyFragment.this).popBackStack();
            }
            builder.setNegativeButton("Discard",null);
            builder.show();
        });
        }
    });
    requireActivity().getOnBackPressedDispatcher().addCallback(this, callback);
  }
}
like image 171
ianhanniballake Avatar answered Jan 28 '23 21:01

ianhanniballake


Add this line in button clicklistner MainActivity.super.onBackPressed(); Replace your Activity name insted of MainActivity

 builder.setPositiveButton("Save", new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int id) {
          dialog.dismiss();
          MainActivity.super.onBackPressed();
         //Replace your Activity name insted of MainActivity
        }
    });
like image 32
Nikunj Paradva Avatar answered Jan 28 '23 21:01

Nikunj Paradva