Android,如何在setWebViewClient()的onPageFinished()方法中关闭进度条?

时间:2012-04-03 03:07:31

标签: android webview progress-bar

在我的活动中,我有一个Webview。我需要在webview加载页面时显示加载(进度条),并在加载页面时关闭进度条。我写了以下代码:

wvBrowser.setWebViewClient(new WebViewClient() {
            @Override
            public void onPageStarted(WebView view, String url, Bitmap favicon) {
                super.onPageStarted(view, url, favicon);

                progressBar = ProgressDialog.show(F1TrackCountryRaceTrackInfo.this, "", "Loading...");
            }

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

                progressBar.dismiss();
            }
        });

当我第一次运行应用程序时,一切都很好,但第二次应用程序崩溃,logcat指向“onPageFinished”中的“progressBar.dismiss();”。

我添加了“onPause()”方法以关闭活动并认为它可能解决了问题,但我仍然遇到同样的问题。

@Override
    protected void onPause() {
        super.onPause();

        if(progressBar.isShowing())
            progressBar.dismiss();

        Toast.makeText(this, "Activity closed.", Toast.LENGTH_LONG).show();

        F1TrackCountryRaceTrackInfo.this.finish();
    }

我的错误是什么以及如何解决?感谢

Logcat错误:

  

04-03 11:14:36.880:E / AndroidRuntime(19613):致命异常:主要   04-03 11:14:36.880:E / AndroidRuntime(19613):   java.lang.NullPointerException 04-03 11:14:36.880:   E / AndroidRuntime(19613):at   com.maxis.f12011.activities.F1TrackCountryRaceTrackInfo $ 1.onPageFinished(F1TrackCountryRaceTrackInfo.java:75)   04-03 11:14:36.880:E / AndroidRuntime(19613):at   android.webkit.CallbackProxy.handleMessage(CallbackProxy.java:289)   04-03 11:14:36.880:E / AndroidRuntime(19613):at   android.os.Handler.dispatchMessage(Handler.java:99)04-03   11:14:36.880:E / AndroidRuntime(19613):at   android.os.Looper.loop(Looper.java:130)04-03 11:14:36.880:   E / AndroidRuntime(19613):at   android.app.ActivityThread.main(ActivityThread.java:3691)04-03   11:14:36.880:E / AndroidRuntime(19613):at   java.lang.reflect.Method.invokeNative(Native Method)04-03   11:14:36.880:E / AndroidRuntime(19613):at   java.lang.reflect.Method.invoke(Method.java:507)04-03 11:14:36.880:   E / AndroidRuntime(19613):at   com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:907)   04-03 11:14:36.880:E / AndroidRuntime(19613):at   com.android.internal.os.ZygoteInit.main(ZygoteInit.java:665)04-03   11:14:36.880:E / AndroidRuntime(19613):at   dalvik.system.NativeStart.main(原生方法)

5 个答案:

答案 0 :(得分:0)

我从onPageStarted()导出“progressBar = ProgressDialog.show(F1TrackCountryRaceTrackInfo.this, "", "Loading...");”并将其放在oncreate()方法中,问题解决了。 现在每次活动开始加载都会显示直到webview加载页面然后onPageFinished()关闭加载栏。

答案 1 :(得分:0)

这里的主要问题是每个主框架加载调用onPageStarted(WebView view, String url, Bitmap favicon)方法一次,因此带有iframe或框架集的页面将为主框架调用onPageStarted一次。这也意味着当嵌入帧的内容发生变化时,即单击目标为iframe的链接时,不会调用onPageStarted。 see here

所以progressbar只是第一次实例化,下次没有实例化。问题是在null上调用dismiss()。

答案 2 :(得分:0)

试试这个工作正常..

private WebView webview;
    ProgressDialog dialog;

    @Override
    protected void onCreate(Bundle savedInstanceState) 
    {       
        super.onCreate(savedInstanceState);
        setContentView(R.layout.abc);




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

         dialog = new ProgressDialog(classname.this);
          dialog.setMessage("Loading......");
          dialog.setIndeterminate(true);
          dialog.setCancelable(true);
          dialog.show();

        webview.getSettings().setJavaScriptEnabled(true);       
        webview.setWebViewClient(new WebviewUrl());
        webview.loadUrl(your url here...);
    }   


    public class WebviewUrl extends WebViewClient  
    {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) 
        {
            view.loadUrl(url);
            return true;
        }
        @Override
        public void onPageFinished(WebView view, String url) 
        {
            // TODO Auto-generated method stub
            super.onPageFinished(view, url);
             if (dialog.isShowing())
             {
                dialog.dismiss();
              }
        }
    }

答案 3 :(得分:0)

老问题,但这就是我的工作方式。

创建并设置进度条和WebView:

private WebView myWebView;
private ProgressBar myProgressBar;

protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(activity_web);

    myWebView = (WebView) findViewById(R.id.ib_web_wv_main);
    myProgresBar = (ProgressBar) findViewById(R.id.ib_web_progressbar);

}

在需要时使进度条可见且不可见:

myWebView.setWebViewClient(new WebViewClient(){

    @Override
    public void onPageStarted(WebView view, String url, Bitmap favicon){

         myProgressBar.setVisibility(View.VISIBLE);
   }

   @Override
   public void onPageFinished(WebView view, String url) {
           myProgressBar.setVisibility(View.INVISIBLE);
        }

    });

答案 4 :(得分:-1)

progressBar.dismiss();方法{。}}之前尝试放置super.onPageFinished(view, url);