Android 防止在FragmentPagerAdapter中重新加载WebView?
我有一个FragmentPagerAdapter用来显示大约6个选项卡,所有这些选项卡都从web服务器加载数据。其中一个选项卡包含从我的服务器加载图像的WebView生成映像的服务器端成本很高,因此我希望减少重新加载WebView的调用次数。对于非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刷回WebView时,WebView都会重新加载,这导致我的web服务器的重新加载时间和负载都很高
- 使用 这是有问题的,因为它将强制加载更多选项卡,即使它们永远不会被查看。这在我的服务器上是不必要的昂贵
- 使用及 文档已经更新,以明确此处不再维护显示状态,因此这对于此场景不再有用
- 将我的活动设置为具有:android:configChanges=“keyboardHidden |方向|屏幕大小” 这适用于旋转情况,但不影响ViewPager/FragmentPagerAdapter在tabs情况下的滑动
这听起来像旧的行为应该是完美的…问题似乎是你正在抹去自己的结果 在配置更改时需要新的
WebView
,否则不需要新的WebView
。而且,如果您已经拥有了WebView
,则无需告诉它做任何事情
所以,我想试试这个:
- 按住在片段的数据成员中的
中创建的onCreateView()
WebView
- 仅当数据成员为空时,才在
中充气布局onCreateView()
- 仅当对布局进行膨胀时才调用
loadUrl()
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中遇到了类似的问题,您的建议很管用