21

这是Fragment包含WebView.
WebFragment.java

public class WebFragment extends Fragment {
String TAG = "WebFragment";
private WebView webView;
private String currentUrl = "http://www.google.com";

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    return inflater.inflate(R.layout.webview_layout, null);
}

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    webView = (WebView) getView().findViewById(R.id.helloWebview);
    initWebView();
    webView.loadUrl(currentUrl);
}

@SuppressLint("SetJavaScriptEnabled")
private void initWebView() {
    webView.getSettings().setJavaScriptEnabled(true);
    webView.addJavascriptInterface(new JavaScriptInterface(), "HTMLOUT");
    webView.setWebViewClient(new WebViewClient() {
        @Override
        public void onPageStarted(WebView view, String url, Bitmap favicon) {
            Log.e(TAG, "Loding...");
            super.onPageStarted(view, url, favicon);
        }
    });
}

class JavaScriptInterface {
    public void showHTML(String html) {
    }
}
}

我还有 2 个基本片段(没有WebView)。然后我将所有这些 3Fragments放入ViewPager(WebFragmentFragment1分别Fragment2) using FragmentAdapter。我添加android:configChanges="orientation|screenSize"AndroidManifest.xml(所以WebView不会重新配置更改)。
现在我的问题是,在运行应用程序时,我将第一页(WebFragmet)更改ViewPager为第二页(Fragment1),然后我又回到了第一页。所以没有问题WebFragment

现在我再次更改了ViewPager这样的WebFragment--> Fragment1-->Fragment2并通过反转上述操作的方向返回到第一页。但当时我看到WebViewinWebFragment正在重新加载。

还有一个问题,每当WebView开始加载时,我都会看到 2 个日志条目。

WebFragment Loading...
WebFragment Loading...

所以我的问题是:
1)如何防止在保留WebView时重新加载? 2)为什么这里加载两次?WebFragmentBackStack
WebView

只要看到这个问题并帮助我(防止 WebView 在 FragmentPagerAdapter 中重新加载?)。

4

3 回答 3

29

在您定义了 viewpager 的主要活动中

在声明 viewpager 之后,如下所示: ViewPager viewpager = (ViewPager) findViewById(R.id.pager);

添加这一行:

viewpager.setOffscreenPageLimit(2);

这将防止您的片段重新创建以滑动两个屏幕,因此当您从 viewpager 中的第 3 页返回到第 1 页时,您的 webview 将不会重新加载。

于 2013-05-09T07:17:12.277 回答
5

android:configChanges这是一个典型的案例,它成为了通过覆盖来解决问题的简单补丁修复的受害者。不幸的是,发生配置更改的原因有多种。所以简单地捕捉屏幕尺寸的变化会错过很多……正如你所发现的。

首先,彻底删除android:configChanges. 然后将以下内容添加到您的WebView片段中。

protected void onSaveInstanceState(Bundle outState) {
  webView.saveState(outState);
}

调整您的 WebView 片段的onActivityCreated方法以包括以下内容:

public void onActivityCreated(Bundle savedInstanceState) {
    webView = (WebView) getView().findViewById(R.id.helloWebview);
    initWebView();

    if (savedInstanceState != null)
        webView.restoreState(savedInstanceState);
    else
        webView.loadUrl(currentUrl);

}

这应该让你朝着正确的方向前进。注意,调用 aWebView的 saveState() 不会保存显示数据。例如,输入标签不会保留用户输入。您需要手动解析网页以保留该数据。根据您使用 WebView 的目的,这将是一个很大的痛苦。

于 2013-05-08T17:47:08.147 回答
2

像这样使用片段。

A extends Fragment

{

   static  WebView w;

   View v;

   private Handler handler = new Handler(){

    @Override
    public void handleMessage(Message message) {

        switch (message.what) {
            case 1:{
                webViewGoBack();
            }break;
        }
    }

    private void webViewGoBack() {
        w.goBack();

        // TODO Auto-generated method stub

    }
};

@Override

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle    savedInstanceState){

 v = inflater.inflate(R.layout.webs, container, false);

 w=(WebView)v.findViewById(R.id.webView1);

//w.loadUrl("");

}

 w.setOnKeyListener(new OnKeyListener(){

 @Override

 public boolean onKey(View v, int keyCode, KeyEvent event) {

            // TODO Auto-generated method stub
   if((keyCode==KeyEvent.KEYCODE_BACK)&& w.canGoBack())

            {

                handler.sendEmptyMessage(1);

                return true;

            }
            return false;
        }

     });
于 2013-04-29T08:11:13.763 回答