Fragment pressing back button

后端 未结 16 2182
清歌不尽
清歌不尽 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 21:12

    Still better solution could be to follow a design pattern such that the back-button press event gets propagated from active fragment down to host Activity. So, it's like.. if one of the active fragments consume the back-press, the Activity wouldn't get to act upon it, and vice-versa.

    One way to do it is to have all your Fragments extend a base fragment that has an abstract 'boolean onBackPressed()' method.

    @Override
    public boolean onBackPressed() {
       if(some_condition)
          // Do something
          return true; //Back press consumed.
       } else {
          // Back-press not consumed. Let Activity handle it
          return false;
       }
    }
    

    Keep track of active fragment inside your Activity and inside it's onBackPressed callback write something like this

    @Override
    public void onBackPressed() {
       if(!activeFragment.onBackPressed())
          super.onBackPressed();
       }
    }
    

    This post has this pattern described in detail

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

    if you are using webview inside a fragment than use this in your onCreateView method

    webView.setOnKeyListener(new View.OnKeyListener(){
    
            @Override
            public boolean onKey(View view, int i, KeyEvent keyEvent) {
                if((i==KeyEvent.KEYCODE_BACK)&& webView.canGoBack()){
                    webView.goBack();
                    return true;
                }
                return false;
            }
        });
    

    and import this class

    import android.view.KeyEvent;
    
    0 讨论(0)
  • 2020-11-29 21:15

    You also need to check Action_Down or Action_UP event. If you will not check then onKey() Method will call 2 times.

    getView().setFocusableInTouchMode(true);
    getView().requestFocus();
    
    getView().setOnKeyListener(new OnKeyListener() {
            @Override
            public boolean onKey(View v, int keyCode, KeyEvent event) {
                    if (event.getAction() == KeyEvent.ACTION_DOWN) {
                        if (keyCode == KeyEvent.KEYCODE_BACK) {
                            Toast.makeText(getActivity(), "Back Pressed", Toast.LENGTH_SHORT).show();
                        return true;
                        }
                    }
                    return false;
                }
            });
    

    Working very well for me.

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

    Easiest way ever:

    onResume():

    @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) {
                    // handle back button's click listener
                    Toast.makeText(getActivity(), "Back press", Toast.LENGTH_SHORT).show();
                    return true;
                }
                return false;
            }
        });
    
    }
    

    Edit 1: If fragment having EditText.

    private EditText editText;
    

    onCreateView():

    editText = (EditText) rootView.findViewById(R.id.editText);
    

    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) {
                    editText.clearFocus();
                }
                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) {
                    // handle back button's click listener
                    Toast.makeText(getActivity(), "Back press", Toast.LENGTH_SHORT).show();
                    return true;
                }
                return false;
            }
        });
    
    }
    

    Note: It will work if you have EditText in fragment.

    Done

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