WebView阻止在RetainInstance片段中重新加载

时间:2014-07-27 18:21:38

标签: android webview fragment

我遇到一个问题,阻止在KeepInstance设置为true的片段内部重新加载WebView。

我尝试过的路线:

SaveInstanceState(由于retainInstance,不会在轮换时传递一个包) 自定义包,保存在onSaveInstanceState上并在create中恢复 保留WebView引用并尝试将其添加回视图层次结构

必须有一种更简单的方法吗?

1 个答案:

答案 0 :(得分:6)

你可以很容易地做到这一点。由于您已经保留了实例,因此在调用Fragment的onDestroyView()时,请保留对Fragment中WebView的引用并将其与父项分离。如果它是非null,只需在onCreateView()中返回它。例如:

public class RetainedWebviewFragment extends Fragment {
    private WebView mWebView;

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

        return mWebView;
    }

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

        if (getRetainInstance() && mWebView.getParent() instanceof ViewGroup) {
            ((ViewGroup) mWebView.getParent()).removeView(mWebView);
        }
    }
}

但是,您将在第一个方向更改时泄漏对第一个Activity的一个引用 - 我还没有弄清楚如何避免。 t根据我的知识,无法在View上设置上下文。但是,如果您对内存泄漏感到满意,这确实有效。

编辑:或者,如果您按照我在此示例中的方式进行编程实例化,则可以使用getActivity().getApplicationContext()来避免泄漏活动。如果使用提供的LayoutInflater,它将在充气时将视图的应用程序的上下文赋予。

不要将应用程序上下文用于WebView - 这会在显示下拉视图和潜在的其他问题时导致意外崩溃。