Search code examples
androidprogress-barandroid-webviewactionbarsherlockandroid-viewpager

ProgressBar in ViewPager with Webview's


Im having some trouble getting this to work properly. I have a ViewPager with 3 webview's and currently am experience issues with is that only case 0 (my first webview) is actually using the progress bar correctly, (stoping when progress is 100, etc). My other 2 webviews progress bars (Case 1 and 2) are however arent doing anything. Any Recommendations?

public class AwesomePagerActivity extends Activity {

private ViewPager awesomePager;
private static int NUM_AWESOME_VIEWS = 3;
private Context context;
private AwesomePagerAdapter awesomeAdapter;
LayoutInflater inflater;
ProgressBar progressBar;

/** Called when the activity is first created. */
public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);
  context = this;
  inflater = (LayoutInflater)
  context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
  awesomeAdapter = new AwesomePagerAdapter();
  awesomePager = (ViewPager) findViewById(R.id.pager);
  awesomePager.setOffscreenPageLimit(3);
  awesomePager.setAdapter(awesomeAdapter);
}
private class AwesomePagerAdapter extends PagerAdapter {

    public int getCount() {
    return NUM_AWESOME_VIEWS;
    }

public Object instantiateItem(View collection, int position) {
    View layout = null;
    LayoutInflater mInflater = (LayoutInflater) context
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    WebView web = null;
    progressBar = (ProgressBar) findViewById(R.id.progressBar1);
    switch (position) {
    case 0:
        layout = mInflater.inflate(R.layout.activity_main, null);
        web = (WebView) layout.findViewById(R.id.webView1);
        web.loadUrl("http://developer.android.com");
        break;
    case 1:
        layout = mInflater.inflate(R.layout.activity_community, null);
        web = (WebView) layout.findViewById(R.id.webView2);
        web.loadUrl("http://www.xda-developers.com");
        break;
    case 2:
        layout = mInflater.inflate(R.layout.activity_support, null);
        web = (WebView) layout.findViewById(R.id.webView3);
        web.loadUrl("http://www.samsung.com");
        break;
    }
    WebSettings websettings = web.getSettings();
    websettings.setBuiltInZoomControls(position == 0 ? false : true);
    websettings.setUseWideViewPort(position == 0 ? true : false);
    websettings.setJavaScriptEnabled(true);
    websettings.setAllowFileAccess(true);
    websettings.setDomStorageEnabled(true);
    websettings.setLoadWithOverviewMode(true);
    web.requestFocusFromTouch();
    websettings.setSavePassword(true);
    web.setWebViewClient(new WebViewClient(){
            public void onPageStarted(WebView view, String url, Bitmap favicon) {

                super.onPageStarted(view, url, favicon);
                progressBar.setVisibility(View.VISIBLE);
            }
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                view.loadUrl(url);
                progressBar.setVisibility(View.VISIBLE);
                return true;
            }

            @Override
            public void onPageFinished(WebView view, String url) {
                super.onPageFinished(view, url);

                progressBar.setVisibility(View.GONE);
            }   
        });
        web.setWebChromeClient(new WebChromeClient(){
            public void onProgressChanged(WebView view, int progress) {
                //MainActivityViewPager.this.setProgress(progress * 100);
                progressBar.setProgress(progress * 100);

            }
            });
    ((ViewPager) collection).addView((View) layout);
    return layout;
}

public void destroyItem(View collection, int position, Object view) {
    ((ViewPager) collection).removeView((View) view);
}

public boolean isViewFromObject(View view, Object object) {
    return view == ((View) object);
}
}
}

Solution

  • Any Recommendations?

    I'm guessing that your have a ProgressBar in each of the three layouts that you use in the ViewPager(with different ids?). The problem is that the progressBar variable will always point to the ProgressBar in the first layout as findViewById returns the first occurrence of the widget with that id(which will come from the first layout which will always be available). The solution is to separate the behavior of those ProgressBars according to the current WebView:

    //...
    switch (position) {
    case 0:
        layout = mInflater.inflate(R.layout.activity_main, null);
        web = (WebView) layout.findViewById(R.id.webView1);
        web.loadUrl("http://developer.android.com");
            progressBar = (ProgressBar) layout.findViewById(R.id.progressBar1);
    break;
    case 1:
            layout = mInflater.inflate(R.layout.activity_community, null);
        web = (WebView) layout.findViewById(R.id.webView2);
        web.loadUrl("http://www.xda-developers.com");
                progressBar = (ProgressBar) layout.findViewById(R.id.progressBar2);
    break;
    case 2:
           layout = mInflater.inflate(R.layout.activity_support, null);
               web = (WebView) layout.findViewById(R.id.webView3);
               web.loadUrl("http://www.samsung.com");
               progressBar = (ProgressBar) layout.findViewById(R.id.progressBar3);
    break;
    }
    // ....
    web.setWebViewClient(new SpecialWebView(progressBar));
    web.setWebChromeClient(new SpecialWebChromeClient(progressBar));
    ((ViewPager) collection).addView((View) layout);
    

    where SpecialWebView and SpecialWebChromeClient are:

    public static class SpecialWebView extends WebViewClient {
    
        private ProgressBar progressBar;
    
        public SpecialWebView(ProgressBar progressBar) {
            this.progressBar = progressBar;
        }
    
        public void onPageStarted(WebView view, String url, Bitmap favicon) {
            super.onPageStarted(view, url, favicon);
        }
    
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {         
            progressBar.setVisibility(View.VISIBLE);
            progressBar.setProgress(0);
            return super.shouldOverrideUrlLoading(view, url);
        }
    
        @Override
        public void onPageFinished(WebView view, String url) {
            super.onPageFinished(view, url);
            progressBar.setVisibility(View.GONE);
        }
    }
    
    
     public static class SpecialWebChromeClient extends WebChromeClient {
    
        ProgressBar progressBar;
    
        public SpecialWebChromeClient(ProgressBar progressBar) {
            this.progressBar = progressBar;
        }
    
        public void onProgressChanged(WebView view, int progress) {
            // MainActivityViewPager.this.setProgress(progress * 100);
            progressBar.setProgress(progress);
        }
    }