2013-03-25 96 views
2

我試圖構建一個ViewPager,其中包含一堆WebViews。我能夠獲得ViewPager的工作,但是,只有最初的WebView正在加載它的內容。當我滑動到其他視圖時,它們會變成空白。沒有錯誤信息或任何東西。當我斷點的代碼中,loadUrl被擊中了正確的網址,所以不知道是怎麼回事:WebView未使用ViewPager加載

活動

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); 
       } 
     }); 
    } 
} 

回答

2

問題可能是以下行:

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

這裏您要求Activity(!)找到第一個ID爲R.id.webview的視圖。現在想想在Activity附加相同的Browser片段的多個實例時會發生什麼......確切地說,總是返回該ID的第一次出現。換句話說:url將始終加載到WebView的第一個附加Browser片段中。

而不是從Activity充氣WebView,你會希望通過在片段的根視圖找到視圖膨脹WebView各自有關Browser片段:

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

基本上你需要使用正確的視圖查找的範圍。

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; 
    }