Android 防止在FragmentPagerAdapter中重新加载WebView?

Android 防止在FragmentPagerAdapter中重新加载WebView?,android,android-fragments,android-webview,Android,Android Fragments,Android Webview,我有一个FragmentPagerAdapter用来显示大约6个选项卡,所有这些选项卡都从web服务器加载数据。其中一个选项卡包含从我的服务器加载图像的WebView生成映像的服务器端成本很高,因此我希望减少重新加载WebView的调用次数。对于非WebView选项卡,我可以保存我的状态(对于那些选项卡,只需一个简单的数组),并在浏览选项卡时恢复它们 问题: 每次我使用FragmentPagerAdapter刷回WebView时,WebView都会重新加载,这导致我的web服务器的重新加载时间

我有一个FragmentPagerAdapter用来显示大约6个选项卡,所有这些选项卡都从web服务器加载数据。其中一个选项卡包含从我的服务器加载图像的WebView生成映像的服务器端成本很高,因此我希望减少重新加载WebView的调用次数。对于非WebView选项卡,我可以保存我的状态(对于那些选项卡,只需一个简单的数组),并在浏览选项卡时恢复它们

问题:

  • 每次我使用FragmentPagerAdapter刷回WebView时,WebView都会重新加载,这导致我的web服务器的重新加载时间和负载都很高
考虑的解决方案:

  • 使用 这是有问题的,因为它将强制加载更多选项卡,即使它们永远不会被查看。这在我的服务器上是不必要的昂贵
  • 使用及 文档已经更新,以明确此处不再维护显示状态,因此这对于此场景不再有用
  • 将我的活动设置为具有:android:configChanges=“keyboardHidden |方向|屏幕大小” 这适用于旋转情况,但不影响ViewPager/FragmentPagerAdapter在tabs情况下的滑动

这听起来像旧的行为应该是完美的…

问题似乎是你正在抹去自己的结果

在配置更改时需要新的
WebView
,否则不需要新的
WebView
。而且,如果您已经拥有了
WebView
,则无需告诉它做任何事情

所以,我想试试这个:

  • 按住在片段的数据成员中的
    onCreateView()
    中创建的
    WebView
  • 仅当数据成员为空时,才在
    onCreateView()
    中充气布局
  • 仅当对布局进行膨胀时才调用
    loadUrl()
(如果您正在Java代码中创建
WebView
,请将“膨胀布局”替换为“通过其构造函数创建
WebView


如果片段的内容超过了
WebView
,您还需要保留在数据成员中膨胀的根视图,这样您就可以从
onCreateView()

返回它,首先我要弄清楚片段中触发重新加载的是什么
WebView
本身不受寻呼机和片段的影响,因此某个地方的某个人正在对
WebView
执行某些操作以触发重新加载。然后,您可以尝试抑制这种行为;如果(savedInstanceState!=null){wv.restoreState(savedInstanceState);}否则{wv.loadUrl(myURL);}主要的事情是刷走导致片段被销毁,正如我所理解的。当它返回时,它尝试恢复状态,但由于WebView不再能够恢复显示状态,它必须重新加载(据我所知这是最好的)。“主要的事情是刷走导致片段被销毁,正如我所理解的”——而不是使用
FragmentPagerAdapter
FragmentPagerAdapter
是“PagerAdapter的一个实现,它将每个页面表示为一个片段,只要用户可以返回到该页面,该片段就会一直保存在片段管理器中。”“在onCreateView中,我有以下内容”--您是否确定每次刷卡时都会调用
onCreateView()
,即使是以前查看过的页面?我知道一旦选项卡超过setOffscreenPageLimit()的限制,就会调用onResume和onCreateView。谢谢您的回答。鉴于WebView只是片段中通过XML膨胀的几个视图之一,您建议采用什么方法?@DerekJohnson:保留膨胀的根视图。仅在
null
时充气。仅在膨胀时调用
loadUrl()
。当我将整个视图保存在实例变量中时,在重新添加时,我得到:java.lang.IllegalStateException:指定的子级已具有父级。必须首先对子级的父级调用removeView()。我知道我需要分离桌面上的视图(),但getView()和getParent()不提供removeAllViews()或removeView()。@DerekJohnson:将
getParent()
返回的
ViewParent
转换为
ViewGroup
并调用合适的移除方法。非常感谢您的标记,我在FragmentTabHost中的WebView中遇到了类似的问题,您的建议很管用