我遇到一个问题,阻止在KeepInstance设置为true的片段内部重新加载WebView。
我尝试过的路线:
SaveInstanceState(由于retainInstance,不会在轮换时传递一个包) 自定义包,保存在onSaveInstanceState上并在create中恢复 保留WebView引用并尝试将其添加回视图层次结构
必须有一种更简单的方法吗?
答案 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 - 这会在显示下拉视图和潜在的其他问题时导致意外崩溃。