Back button in android webview within a fragment

后端 未结 3 963
傲寒
傲寒 2021-01-26 16:10

I have created a webview within a fragment however when I am trying to press the back button, it is killing the app instead of going back. What i want is to go back when i pres

相关标签:
3条回答
  • 2021-01-26 16:40

    If you use the Web fragment and other fragments in your activity, this code works:

    In your Activity:

    @Override
    public void onBackPressed() {
        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        if (drawer.isDrawerOpen(GravityCompat.START)) {
            drawer.closeDrawer(GravityCompat.START);
        } else {
            // Webview back
            if (getSupportFragmentManager().findFragmentById(R.id.fragment_content) instanceof YourWebFragment){
                final YourWebFragment webFragment = (YourWebFragment) getSupportFragmentManager().findFragmentById(R.id.fragment_content);
                if (webFragment != null){
                    if (webFragment.onBackPressed()){
                        return;
                    }
                }
            }
            // Fragments back
            if (getSupportFragmentManager().getBackStackEntryCount() > 0) {
                getSupportFragmentManager().popBackStack();
            } else {
                super.onBackPressed();
            }
        }
    }
    

    In your Web Fragment:

    public boolean onBackPressed() {
        if (webView.canGoBack()) {
            webView.goBack();
            return true;
        }
        return false;
    }
    

    Reference: https://stackoverflow.com/a/19268540/1329094 and https://stackoverflow.com/a/10631591/1329094

    0 讨论(0)
  • 2021-01-26 16:46

    You can override the Activity's onBackPressed() method and check if there is any previous fragment in the backstack to pop back by calling getFragmentManager().popBackStackImmediate() or getSupportFragmentManager().popBackStackImmediate() like the code below:

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

    Don't forget to call .addToBackStack(null) before you call commit() to add the fragmenttransaction to the backstack.

    And if you want to press back button to go back to previous webpage user has navigated in the WebView before go back to previous fragment, you can do this:

    @Override
    public void onBackPressed() {
        if (webView.canGoBack()) {
                webView.goBack();
        } else if (!getFragmentManager().popBackStackImmediate()) {
            super.onBackPressed();        
        }
    }
    

    And remember to set your webView to load any webpage in the WebView by calling webView.setWebViewClient(new WebViewClient());

    0 讨论(0)
  • 2021-01-26 16:52

    In Kotlin you can achieve this by adding setOnKeyListener to your WebView. This listener responds to clicks on the device's hardware buttons.

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        val myWebView: WebView = view.findViewById(R.id.your_webView)
        myWebView.webViewClient = WebViewClient()
        myWebView.loadUrl("https://www.google.com/")
        myWebView.setOnKeyListener { v, keyCode, event ->
            if (keyCode == KeyEvent.KEYCODE_BACK && myWebView.canGoBack()) {
                myWebView.goBack() // Navigate back to previous web page if there is one
                nested_scroll.scrollTo(0, 0) // Scroll webview back to top of previous page
            }
            true
        }
    }
    
    0 讨论(0)
提交回复
热议问题