【问题标题】:Back button in android webview within a fragment片段内android webview中的后退按钮
【发布时间】:2025-12-08 02:10:02
【问题描述】:

我在片段中创建了一个 webview,但是当我尝试按下后退按钮时,它正在杀死应用程序而不是返回。我想要的是当我按下返回按钮时返回,如果我已经在主页上,返回按钮应该会杀死应用程序。

我已尝试使用给定链接中的所有解决方案。

How to add "Go Back" function in WebView inside Fragment?

请帮忙。

【问题讨论】:

  • 什么不适用于this 方法?

标签: android android-studio android-fragments android-studio-2.2 android-studio-2.0


【解决方案1】:

您可以覆盖 Activity 的 onBackPressed() 方法,并通过调用 getFragmentManager().popBackStackImmediate() 或 getSupportFragmentManager().popBackStackImmediate() 来检查 backstack 中是否有任何先前的片段要弹出,如下面的代码:

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

在调用 commit() 之前不要忘记调用 .addToBackStack(null) 以将 fragmenttransaction 添加到 backstack。

如果您想按返回按钮返回上一个网页,用户在返回上一个片段之前已经在 WebView 中导航,您可以这样做:

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

记得通过调用 webView.setWebViewClient(new WebViewClient()); 来设置你的 webView 来加载 WebView 中的任何网页。

【讨论】:

  • 老兄说真的,你是个天才……它真的很管用……你能帮我处理多个片段吗……如果我有多个片段和单独的 webviews,我该如何使用 onBackPressed?另外,如果通过导航栏打开片段并返回主屏幕,我该怎么做才能杀死片段。
  • 带有单独 web 视图的多个片段?意味着每个片段里面都会有自己的webview?你能详细说明一下吗?
  • 我想关闭片段并使用后退按钮从应用程序抽屉返回主要活动。可能吗。我需要做什么?我不想更改上面的代码,因为它很有帮助
  • 片段是否显示在另一个活动中?那么从那里你想回到主要活动吗?
  • 当我点击导航抽屉中的任何选项时会打开片段,但是当我按下后退按钮时,它会关闭应用程序而不是返回主要活动。
【解决方案2】:

如果您在 Activity 中使用 Web 片段和其他片段,则此代码有效:

在您的活动中:

@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();
        }
    }
}

在您的网络片段中:

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

参考: https://*.com/a/19268540/1329094https://*.com/a/10631591/1329094

【讨论】:

    【解决方案3】:

    在 Kotlin 中,您可以通过将 setOnKeyListener 添加到您的 WebView 来实现此目的。此侦听器响应对设备硬件按钮的点击。

    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
        }
    }
    

    【讨论】:

    • setonKeyListener 被触发两次。也需要添加event.action == KeyEvent.ACTION_UP。此外,如果您导航一次,则无法使用返回按钮关闭应用程序。