gpt4 book ai didi

android - 防止 WebView fragment 在屏幕旋转时重新加载页面

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:37:02 27 4
gpt4 key购买 nike

我知道这个问题已经被问过太多次了,而且 SO 也充满了类似的问题。我经历了其中的大部分,我已经研究了几天这个问题,但我还没有找到最终的解决方案。

我可以轻松地避免所有这些麻烦,将 configChanges="orientation|screenSize" 添加到包含 WebView 的 Activity ;我已经对此进行了测试并且它按预期工作(WebView 没有重新加载)。 但我真的很想避免这种解决方案。

这是我当前的 WebView 实现:

public class BrowserFragment extends Fragment {

private WebView mWebView;

public BrowserFragment() {
// Required empty public constructor
}

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

setRetainInstance(true);
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
if (mWebView == null) {
mWebView = new WebView(getActivity());
}

return mWebView;
}

@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);

mWebView.setWebViewClient(new WebViewClient() {

@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
return super.shouldOverrideUrlLoading(view, url);
}

});

mWebView.getSettings().setAllowFileAccess(true);
mWebView.getSettings().setBuiltInZoomControls(false);
mWebView.getSettings().setDomStorageEnabled(true);
mWebView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
mWebView.getSettings().setJavaScriptEnabled(true);
mWebView.getSettings().setSupportZoom(false);

if (savedInstanceState == null) {
mWebView.loadUrl("http://developer.android.com/");
} else {
mWebView.restoreState(savedInstanceState);
}
}

@Override
public void onResume() {
mWebView.onResume();

super.onResume();
}

@Override
public void onPause() {
super.onPause();

mWebView.onPause();
}

@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);

mWebView.saveState(outState);
}

@Override
public void onDestroyView() {
if (getRetainInstance() && mWebView.getParent() instanceof ViewGroup) {
((ViewGroup) mWebView.getParent()).removeView(mWebView);
}

super.onDestroyView();
}

}

至于MainActivity,除了将内容 View 设置为以下布局文件外,没有其他内容:

<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">

<fragment
android:id="@+id/fragment_browser"
android:name="com.example.app.BrowserFragment"
android:layout_width="match_parent"
android:layout_height="match_parent" />

</merge>

请注意,上面我保留了 fragment 实例,并且还保存了 WebView 的状态,因此我可以稍后恢复相同的状态。这是文档中关于 restoreState 方法的内容:

Restores the state of this WebView from the given Bundle. This method is intended for use in onRestoreInstanceState(Bundle) and should be called to restore the state of this WebView. If it is called after this WebView has had a chance to build state (load pages, create a back/forward list, etc.) there may be undesirable side-effects. Please note that this method no longer restores the display data for this WebView.

意思是,显示数据不会恢复,但滚动位置之类的东西会恢复(我也对此进行了测试,它运行良好)。这就是为什么我要创建 WebView 的新实例,只有当它在 onCreateView 期间为 null 并在 onDestroyView 期间将其从父 View 中删除时。这是取自这个答案:https://stackoverflow.com/a/32801278/40480

此机制将使旋转过程更加流畅(没有它,将显示一个完整的空白页面)但不会阻止 WebView 仍然重新加载页面。

有什么办法可以解决这个问题吗?

最佳答案

我遇到了类似的问题。有点晚了,但我的解决方法与你的类似,但再次将 webview 添加到 onCreateView 中的布局:

  • 如果实例为 null(第一次),则创建新的 WebView 并将其添加到布局(在我的例子中,父级是 FrameLayout,位于位置 0)。
  • 如果已经创建( Activity 重新创建)只需添加到框架并使其失效(重要的是在旋转时重绘 webview)

    mFrame = (FrameLayout) mView.findViewById(R.id.dq_fragment_browser_common_frame);

    if (mWebView == null){
    mWebView = new CommonWebView(getContext());
    mFrame.addView(mWebView,0);
    } else {
    mFrame.addView(mWebView,0);
    mWebView.invalidate();
    }

在您的情况下,我从 OnDestroyView() 中的框架中删除了 webview,以便能够在 onCreateView 中再次添加它:

@Override
public void onDestroyView() {
mFrame.removeView(mWebView);
super.onDestroyView();
}

注意:我不会在重新加载页面时保存和存储 webview 状态(至少在我的情况下)。此外,滚动位置在纵向/横向中通常不匹配,但据我检查,在 Chrome 中存在同样的问题。

问候。

关于android - 防止 WebView fragment 在屏幕旋转时重新加载页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36800735/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com