Fragment pressing back button

后端 未结 16 2180
清歌不尽
清歌不尽 2020-11-29 20:18

I am now having an activity containing fragments

[1] , [2] , [3] , [4]

If pressing buttons , [3] , it can be redirected to [4]

I would like to imp

相关标签:
16条回答
  • 2020-11-29 20:52

    You can use this .. Worked for me..

    It seems as though fragment [3] is not removed from the view when back is pressed so you have to do it manually!

    First of all, dont use replace() but instead use remove and add separately. It seems as though replace() doesnt work properly.

    The next part to this is overriding the onKeyDown method and remove the current fragment every time the back button is pressed.

     @Override
     public boolean onKeyDown(int keyCode, KeyEvent event)
     {
     if (keyCode == KeyEvent.KEYCODE_BACK)
     {
        if (getSupportFragmentManager().getBackStackEntryCount() == 0)
        {
            this.finish();
            return false;
        }
        else
        {
            getSupportFragmentManager().popBackStack();
            removeCurrentFragment();
    
            return false;
        }
    
    
    
     }
    
      return super.onKeyDown(keyCode, event);
     }
    
    
    public void removeCurrentFragment()
    {
    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
    
    Fragment currentFrag =  getSupportFragmentManager().findFragmentById(R.id.f_id);
    }
    
    0 讨论(0)
  • 2020-11-29 20:53

    i use a methode to change fragments it has thw following code

     getSupportFragmentManager().beginTransaction().setCustomAnimations(R.anim.enter, R.anim.exit, R.anim.pop_enter, R.anim.pop_exit).replace(R.id.content_frame, mContent, mContent.getClass().getSimpleName()).addToBackStack(null)
                    .commit();
    

    and for the back button this .

    @Override
        public void onBackPressed() {
            // note: you can also use 'getSupportFragmentManager()'
            FragmentManager mgr = getSupportFragmentManager();
            if (mgr.getBackStackEntryCount() == 1) {
                // No backstack to pop, so calling super
                finish();
            } else {
                mgr.popBackStack();
            }
        }
    

    the important thing to note is i use 1 for checking getBackStackEntryCount this is because if you dont use it and use 0 user sees nothing for the last back button.

    0 讨论(0)
  • 2020-11-29 21:00

    This worked for me.

    -Add .addToBackStack(null) when you call the new fragment from activity.

        FragmentTransaction mFragmentTransaction = getFragmentManager()
                    .beginTransaction();
        ....
        mFragmentTransaction.addToBackStack(null);
    

    -Add onBackPressed() to your activity

        @Override
    public void onBackPressed() {
        if (getFragmentManager().getBackStackEntryCount() == 0) {
            this.finish();
        } else {
            getFragmentManager().popBackStack();
        }
    }
    
    0 讨论(0)
  • 2020-11-29 21:00

    Solution for Pressing or handling back button in Fragment.

    The way I solved my issue I am sure it will helps you too:

    1.If you don't have any Edit Text-box in your fragment you can use below code

    Here MainHomeFragment is main Fragment (When I press back button from second fragment it will take me too MainHomeFragment)

        @Override
        public void onResume() {
    
        super.onResume();
    
        getView().setFocusableInTouchMode(true);
        getView().requestFocus();
        getView().setOnKeyListener(new View.OnKeyListener() {
            @Override
            public boolean onKey(View v, int keyCode, KeyEvent event) {
    
                if (event.getAction() == KeyEvent.ACTION_UP && keyCode == KeyEvent.KEYCODE_BACK){
    
                    MainHomeFragment mainHomeFragment = new SupplierHomeFragment();
                    android.support.v4.app.FragmentTransaction fragmentTransaction =
                            getActivity().getSupportFragmentManager().beginTransaction();
                    fragmentTransaction.replace(R.id.fragment_container, mainHomeFragment);
                    fragmentTransaction.commit();
    
                    return true;    
                }    
                return false;
            }
        }); }
    

    2.If you have another fragment named as Somefragment and it has Edit text-box then you can do it by this way.

    private EditText editText;
    

    Then In,

    onCreateView():    
    editText = (EditText) view.findViewById(R.id.editText);
    

    Then Override OnResume,

    @Override
    public void onResume() {
        super.onResume();
    
        editText.setOnKeyListener(new View.OnKeyListener() {
            @Override
            public boolean onKey(View v, int keyCode, KeyEvent event) {
                if (keyCode == KeyEvent.KEYCODE_BACK) {
                    editTextOFS.clearFocus();
                    getView().requestFocus();
                }
                return false;
            }
        });
    
        getView().setFocusableInTouchMode(true);
        getView().requestFocus();
        getView().setOnKeyListener(new View.OnKeyListener() {
            @Override
            public boolean onKey(View v, int keyCode, KeyEvent event) {
    
                if (event.getAction() == KeyEvent.ACTION_UP && keyCode == KeyEvent.KEYCODE_BACK){
    
                    MainHomeFragment mainHomeFragment = new SupplierHomeFragment();
                    android.support.v4.app.FragmentTransaction fragmentTransaction =
                            getActivity().getSupportFragmentManager().beginTransaction();
                    fragmentTransaction.replace(R.id.fragment_container, mainHomeFragment);
                    fragmentTransaction.commit();
    
                    return true;
    
                }
    
                return false;
            }
        });
    
    }
    

    That's all folks (amitamie.com) :-) ;-)

    0 讨论(0)
  • 2020-11-29 21:02

    This is a working solution for me:

    dialog.setOnKeyListener(new DialogInterface.OnKeyListener() {
                        @Override
                        public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) {
                            if (keyCode == KeyEvent.KEYCODE_BACK) {
                                // DO WHAT YOU WANT ON BACK PRESSED
                                return true;
                            }
                            return false;
                        }
                    });
    

    Edit: You can replace dialog with getView() for fragments.

    0 讨论(0)
  • 2020-11-29 21:03

    use this (in kotlin)

     activity?.onBackPressedDispatcher?.addCallback(this, object : OnBackPressedCallback(true) {
            override fun handleOnBackPressed() {
                // in here you can do logic when backPress is clicked
            }
        })
    

    i think this is the most elegant way to do it

    0 讨论(0)
提交回复
热议问题