3

我正在尝试构建一个ViewPager包含一堆WebViews. 我能够得到ViewPager工作,但是,只有初始WebView加载它的内容。当我滑动到其他视图时,它们是空白的。没有错误信息或任何东西。当我对代码进行断点时,loadUrl正在使用正确的 Url 命中,所以不确定发生了什么:

活动

public class BrowserPager extends SherlockFragmentActivity {
    private  List <String> urls;
    private static int NUMBER_OF_PAGES;

    @Override
    public void onCreate(final Bundle icicle)
    {    
        setContentView(R.layout.browser_pager);

        urls = GetUrls();
        NUMBER_OF_PAGES = urls.getCount();

        mViewPager = (ViewPager)findViewById(R.id.pager);
        mMyFragmentPagerAdapter = new MyFragmentPagerAdapter(getSupportFragmentManager());
        mViewPager.setAdapter(mMyFragmentPagerAdapter);
    }

    private static class MyFragmentPagerAdapter extends FragmentStatePagerAdapter  {  

        public MyFragmentPagerAdapter(FragmentManager fm) {  
             super(fm);  
        }  

        @Override
        public Fragment getItem(int index) {            
            return Browser.newInstance(urls.get(index));
        }

        @Override
        public int getCount() {  
             return NUMBER_OF_PAGES;  
        }
   }
}

分段

public class Browser extends SherlockFragment {

    private String mUrl;
    private WebView mWebView;

    public static Browser newInstance(String url) {

        Browser b = new Browser();
        Bundle bundle = new Bundle();
        bundle.putString("url", url);
        b.setArguments(bundle);

        return b;
    }

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

        if (getArguments() != null)
            mUrl = getArguments().getString("url");     

        return inflater.inflate(R.layout.browser, container, false);
    }

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

        DisplaySite();
    }   

    private void DisplaySite() {

        mWebView = (WebView)getActivity().findViewById(R.id.webview);

        mWebView.getSettings().setSupportZoom(true);  
        mWebView.getSettings().setBuiltInZoomControls(true);
        mWebView.loadUrl(mUrl);

        final ProgressBar progess = (ProgressBar)getActivity().findViewById(R.id.ProgressBar);

        mWebView.setWebViewClient(new WebViewClient() {
              public void onPageStarted(WebView view, String url, Bitmap favicon) {
                progess.setVisibility(View.VISIBLE);
                progess.setProgress(0);
              }

              public void onPageFinished(WebView view, String url) {
                progess.setVisibility(View.GONE);
              }

        });

        mWebView.setWebChromeClient(new WebChromeClient() {

              public void onProgressChanged(WebView view, int progress) {
                  progess.setProgress(progress);
              }
        });
    }   
}
4

2 回答 2

2

问题可能是以下行:

mWebView = (WebView)getActivity().findViewById(R.id.webview);

在这里,您要求Activity(!) 找到具有 id 的第一个视图R.id.webview。现在想想当有多个相同Browser片段的实例附加到Activity...时会发生什么。确切地说,总是返回具有该 id 的第一个匹配项。换句话说:url 将始终加载到WebView第一个附加Browser片段的 。

而不是WebView从膨胀Activity,您将希望通过在片段的根视图中找到视图来膨胀WebView与每个片段相关的内容:Browser

mWebView = (WebView) getView().findViewById(R.id.webview);

基本上,您需要使用正确的范围进行视图查找。

于 2013-03-25T23:46:20.847 回答
0

如果您将适配器设置为从 PagerAdapter 继承,则可以完成此操作。https://goo.gl/0J1aCh

 @Override
    public Object instantiateItem(ViewGroup container, int position) {

        Page page = pages.get(position);
        Magazine magazine = dispatcher.getMagazine();

        WebView webView = new WebView( activity );
        ActionBar.LayoutParams params =
                new ActionBar.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT );

        webView.setLayoutParams(params);

        webView.getSettings().setJavaScriptEnabled(true);
        webView.loadUrl( magazine.getFileLocation() + "/" + page.getName());

        container.addView( webView );

        return webView;
    }
于 2015-09-11T21:36:21.667 回答