webview 在不关闭应用程序的情况下返回(kotlin)

webview go back without closing the app(kotlin)

M 应用程序将显示 WebView 但是当我进入网站的其他部分(如 cat.html)然后点击返回时,它会关闭应用程序而不是返回到 index.html(主页)

所以我想知道这将如何工作,比如如何在不关闭应用程序的情况下返回 index.html

我的代码:

class HomeFragment : Fragment() {

    private lateinit var homeViewModel: HomeViewModel

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        val v = inflater.inflate(R.layout.fragment_home, container, false)
        val webview = v.findViewById<View>(R.id.webview) as WebView
        webview.settings.javaScriptEnabled = true
        webview.settings.setAppCacheEnabled(true)
        webview.webViewClient = WebViewClient()
        webview.loadUrl("file:///android_asset/newsfeed/index.html")
        return v
    }

}

TL;DR

您必须直接在 Activity 中的 onBackPressed() 方法中处理这种情况(而不是在 Fragment 中)。

您可以通过多种方式处理这种情况,例如通过:

  • 直接使用Fragment对象

  • 为此

  • 实现一些额外的接口
  • ViewModel

如果您将直接在 Activity

中使用您的 WebView

你可以使用像这样简单的东西:

override fun onBackPressed() {
    if (webView.canGoBack()) {
        // If possible - go back in WebView
        webView.goBack()
    } else {
        // If NOT possible - just handle going back as always
        super.onBackPressed()
    }
}

其中 webView 是您在 XML 布局文件中的视图(在 onCreate() 方法中膨胀)。

但是当你在 Fragment 中有 WebView 时,你必须:

1) 在片段中创建新方法,

  • return信息"can go back in WebView"与否。

  • "say" 应该返回的 WebView

我稍微修复了你的 Android 流程(使用 onCreateView)并使用 Kotlin Extension 在 WebView

中设置属性
class HomeFragment : Fragment() {

    /**
     * New method, allowing as to check "can we go back in WebView or not"
     */
    fun webViewCanGoBack() = webview.canGoBack()

    /**
     * New method, saying WebView that should go back
     */
    fun webViewGoBack() = webview.goBack()


    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? = inflater.inflate(R.layout.fragment_home, container, false)

    @SuppressLint("SetJavaScriptEnabled")
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        webview.run {
            settings.run {
                javaScriptEnabled = true
                setAppCacheEnabled(true)
            }

            webViewClient = WebViewClient()
            loadUrl("http://www.google.com")
        }
    }
}

2) 在 activity.

onBackPressed() 方法中使用新方法

记住,你是在这个片段的现有实例上调用这个方法,所以你必须把它存储在某个地方:

override fun onBackPressed() {
    if (homeFragment.webViewCanGoBack()) {
        // If possible - go back in WebView
        homeFragment.webViewGoBack()
    } else {
        // If NOT possible - just handle going back as always
        super.onBackPressed()
    }
}