【问题标题】:android-how to go back through fragments with webViewandroid-如何使用 webView 返回片段
【发布时间】:2019-10-29 08:51:06
【问题描述】:

我正在开发一个应用程序,用户可以在其中打开任意数量的片段,但所有片段都是唯一类的对象。片段类的视图中只有一个 WebView。每次用户单击 webiew 中的链接时,链接都会加载到新片段中。这就是新片段替换当前片段的方式:

transaction.replace(R.id.fragment_holder, PageFragment.newInstance(url)).addToBackStack(null).commit();

当用户点击返回按钮时:

getActivity().getSupportFragmentManager().popBackStack();

一切正常,但是当用户想要返回时,我遇到了一些麻烦。关键是,当从 backstack 弹出前一个片段时,它的 webview 再次开始加载它的 url,这是不可取的。我希望之前的片段恢复一切:webview 状态,包括加载的数据、滚动位置等。如何实现这种行为?

【问题讨论】:

    标签: android android-fragments webview fragment-backstack


    【解决方案1】:

    尝试添加而不是使用替换,并在代码中将 .replace 替换为 .add 片段。这样您可以将其状态保存在应用程序中。

    【讨论】:

    • 对,但是它会很快增加内存使用量,打开10个片段后,由于内存泄漏,应用程序会变得很慢
    • 您可以在使用删除功能@Soheil从片段中按回时将其删除
    • @ArchuMohan 是的,但假设用户想要打开 20 个片段。由于我们使用add方法,所有的视图都将保持打开状态(在用户按下返回按钮之前,我们开始将它们一一删除),这是一个巨大的内存消耗。
    • 我猜这是您可以实现的唯一方法,如果您为用户使用单个 webview,您可以在同一片段 @Soheil 中附加 URL 并每次刷新 webview
    • @ArchuMohan 那么我不能在片段之间有任何我想要的过渡动画
    【解决方案2】:

    您可以使用网络视图返回。在你的背压法中试试这个

    if (webView.canGoBack()) {
                webView.goBack();
            }
    

    【讨论】:

    • 不可取!我希望每个 url 在一个新的片段中打开,片段之间有一个过渡动画!
    • 创建一个新的 WebViewClient 并根据您的要求在 shouldOverrideUrlLoading() 和 onPageFinished() 方法中进行更改。当用户单击链接时启动动画,并在页面加载完成时停止。
    • 我认为你误解了这个问题。关键是我希望用户能够在点击后退按钮时准确地看到前一个片段及其内容(我不希望 webview 再次加载前一个 url!)
    【解决方案3】:

    有 55 个片段,3 GB 内存没有问题。所以我相信它很实用。

    【讨论】:

    • 这完全取决于每个 webview 中的数据量有多大!所以我认为你所说的没有意义!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-11
    • 2016-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多