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

Jam*_*ieB 0 android fragment webview

我在阻止WebView在retainInstance设置为true的片段内时重新加载时遇到问题.

我试过的路线:

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

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

kco*_*ock 6

你可以很容易地做到这一点.由于您已经保留了实例,因此WebView在调用Fragment的onDestroyView()时,请保留对Fragment中的引用并将其与父项分离.如果它是非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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,您将在第一个方向更改时泄漏一个对第一个Activity的引用 - 我还没有想到如何避免.t根据我的知识,无法在View上设置上下文.但是,如果你对那个内存泄漏没问题,这确实有效.

编辑:或者,如果你像我在这个例子中那样以编程方式实例化它,你可以使用它getActivity().getApplicationContext()来避免泄漏活动.如果使用提供的LayoutInflater,它将在充气时将视图的应用程序的上下文赋予.

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