How to add “Go Back” function in WebView inside Fragment?

前端 未结 13 2036
余生分开走
余生分开走 2020-11-27 05:21

UPDATE: Solved! Problem was related to my Viewpager not WebView.

I\'m trying to add a \"Go Back\" function to my WebView which is insid

相关标签:
13条回答
  • 2020-11-27 05:31

    First of all get back pressed in fragment

     mContentView.setFocusableInTouchMode(true);
     mContentView.requestFocus();
     mContentView.setOnKeyListener( new OnKeyListener()
     {
       @Override
       public boolean onKey( View v, int keyCode, KeyEvent event )
      {
          if( keyCode == KeyEvent.KEYCODE_BACK && mWebView.canGoBack())
          {                                                    
                mWebView.goBack();
                return true;
          }
          return false;
      }
     } );
    

    hope it will works.

    0 讨论(0)
  • 2020-11-27 05:32

    In WebViewActivity.java, I added 1 method:

    @Override
    public void onBackPressed() {
    
        WebViewFragment fragment = (WebViewFragment)
                getSupportFragmentManager().findFragmentById(R.id.fragmentContainer);
        if (fragment.canGoBack()) {
            fragment.goBack();
        } else {
            super.onBackPressed();
        }
    }
    

    In WebViewFragment.java, I added 2 methods:

    public boolean canGoBack() {
        return mWebView.canGoBack();
    }
    
    public void goBack() {
        mWebView.goBack();
    }
    
    0 讨论(0)
  • 2020-11-27 05:34

    I've created a simple interface:

    public interface IOnBackPressed {
        boolean onBackPressed();
    }
    

    in the Activity:

    public class MyActivity extends Activity {
        @Override public void onBackPressed() {
        Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.main_container);
           if (!(fragment instanceof IOnBackPressed) || !((IOnBackPressed) fragment).onBackPressed()) {
              super.onBackPressed();
           }
        }
    }
    

    in the Fragment:

    public class MyFragment extends Fragment implements IOnBackPressed {
       @Override
        public boolean onBackPressed() {
            if (webview.canGoBack()) {
                webview.goBack();
                // backpress is not considered in the Activity
                return true;
            } else {
                // activity will act normal
                return false;
            }
        }
    }
    
    0 讨论(0)
  • 2020-11-27 05:34

    This is how I did in my app. I consume back press event till web view can go back. Once web view cant go back I show hint to user that if he keep on pressing back then app will exit.

    It will give user a chance to stay in your app when webview cant go back. I felt it more user friendly:

              //time passed between two back presses.
              private val TIME_INTERVAL = 200 
               // variable to keep track of last back press
              private var mBackPressed: Long = 0
    
    
            webView!!.requestFocus()
            webView.setOnKeyListener(View.OnKeyListener { v, keyCode, event ->
                if (keyCode == KeyEvent.KEYCODE_BACK
                        && event.action == MotionEvent.ACTION_UP
                      ) {
                    if(webView.canGoBack()) {
                        //go back in previous page
                        webView.goBack()
                        return@OnKeyListener true
                    }
                    else
                    {
                        if (mBackPressed + TIME_INTERVAL > System.currentTimeMillis())
                        {   // dont consume back press and pass to super
                            return@OnKeyListener false
                        }
                        else {
                            // show hint for double back press
                            Toast.makeText(context, " Double Tap back button to exit the demo", Toast.LENGTH_SHORT).show();
                            mBackPressed = System.currentTimeMillis();
                            return@OnKeyListener true
                        }
                    }
                }
                return@OnKeyListener false
    
            })
    
    0 讨论(0)
  • 2020-11-27 05:40

    There is a simple way with BackPressedDispatcher

    Fragment:

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val callback = object : OnBackPressedCallback(true) {
            override fun handleOnBackPressed() {
                if(webView.canGoBack()){
                   webView.goBack()
                } else {
                    isEnabled = false
                    requireActivity().onBackPressed()
                }
            }
        }
        requireActivity().onBackPressedDispatcher.addCallback(this,callback)
    }
    

    Activity :

    override fun onBackPressed() {
        val fragment = supportFragmentManager.findFragmentByTag("WebViewFragment")
        if (WebViewFragment::class.java.isInstance(fragment)) {
            if (onBackPressedDispatcher.hasEnabledCallbacks()) {
                onBackPressedDispatcher.onBackPressed()
                return
            }
            super.onBackPressed()
        }
    }
    

    Maybe these codes can be improved, but it works very well for me. For more information visit here.

    0 讨论(0)
  • 2020-11-27 05:41

    You can check this code :

        webView.canGoBack();
        webView.setOnKeyListener(new View.OnKeyListener() {
    
            public boolean onKey(View v, int keyCode, KeyEvent event) {
                if (keyCode == KeyEvent.KEYCODE_BACK
                        && event.getAction() == MotionEvent.ACTION_UP
                        && webView.canGoBack()) {
                    webView.goBack();
                    return true;
                }
                return false;
            }
        });
    
    0 讨论(0)
提交回复
热议问题