【问题标题】:How do i make my progress dialog dismiss after webview is loaded?加载 webview 后,如何使我的进度对话框消失?
【发布时间】:2010-07-19 18:19:17
【问题描述】:

在加载 web 视图后,我的代码需要什么才能创建对话框 dismiss()

public void onCreate(Bundle savedInstanceState) { 
            super.onCreate(savedInstanceState); 
            setContentView(R.layout.main); 
            CookieSyncManager.createInstance(this);
            CookieSyncManager.getInstance().startSync();
            webview = (WebView) findViewById(R.id.webview);
            webview.setWebViewClient(new homeClient());
            webview.getSettings().setJavaScriptEnabled(true);
            webview.getSettings().setPluginsEnabled(true);
            webview.loadUrl("http://google.com");

            ProgressDialog pd = ProgressDialog.show(Home.this, "", 
                    "Loading. Please wait...", true);

        }

我试过了

public void onPageFinshed(WebView view, String url){
        pd.dismiss();
    }

没用。

【问题讨论】:

  • 是否调用了 onPageFinished?在 ui 线程中?
  • 对不起,我一开始就应该这样做,我把整个班级都按照我目前的方式。如果你向上滚动你可以看到我尝试了一个 onPageFinshed 并且它没有工作。也许我这样做的方式是错误的?还是我放在哪里?

标签: java android webview progressdialog dismiss


【解决方案1】:

:o webview.setWebViewClient(new homeClient()); homeClient()????

试试这个

...
...
...

webview = (WebView) findViewById(R.id.webview);
webview.setWebViewClient(new WebViewClient() {
            public boolean shouldOverrideUrlLoading(WebView view, String url) {              
                view.loadUrl(url);
                return true;
            }


          public void onPageFinished(WebView view, String url) {
                if (progressBar.isShowing()) {
                    progressBar.dismiss();
                }
            }
 webview.loadUrl("http://www.google.com");

}

更新:: 这是一个很好的例子。

Android WebView and the Indeterminant Progress Solution

【讨论】:

    【解决方案2】:

    没关系。

    public class WordActivity extends Activity {
    
        private WebView webview;
        private ProgressDialog progressDialog;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.webview);
            Bundle objetbunble  = this.getIntent().getExtras(); 
            webview = (WebView) findViewById(R.id.webview);
    
            final Activity activity = this;
    
            webview.getSettings().setJavaScriptEnabled(true);
    
            webview.setWebViewClient(new WebViewClient() {
                public boolean shouldOverrideUrlLoading(WebView view, String url) {              
                    view.loadUrl(url);
                    return true;
                }
                public void onLoadResource (WebView view, String url) {
                    if (progressDialog == null) {
                        progressDialog = new ProgressDialog(activity);
                        progressDialog.setMessage("Chargement en cours");
                        progressDialog.show();
                    }
                }
                public void onPageFinished(WebView view, String url) {
                    if (progressDialog.isShowing()) {
                        progressDialog.dismiss();
                        progressDialog = null;
                    }
                }
            }); 
            webview.loadUrl("http://www.example.com");
        }
    
    
    }
    

    【讨论】:

    • 嘿,塞缪尔,我已经使用你的 webviews 代码进行初始启动,一切正常。因此,当我第二次导航到相同的 web 视图时,在 pagefinish 后连续显示 progressdialog(注意:等待 10 分钟,但进度对话框没有关闭)请帮助我,我该怎么做 .. 在此先感谢...
    【解决方案3】:

    @Jorgesys 这不是 100% 准确的。如果您在一个页面中有多个 iframe,您将有多个 onPageFinished(和 onPageStarted)。如果您有多个重定向,它也可能会失败。我认为这种方法可以解决所有问题:

    boolean loadingFinished = true;
    boolean redirect = false;
    
    mWebView.setWebViewClient(new WebViewClient() {
    
       @Override
       public boolean shouldOverrideUrlLoading(WebView view, String urlNewString) {
           if (!loadingFinished) {
              redirect = true;
           }
    
       loadingFinished = false;
       webView.loadUrl(urlNewString);
       return true;
       }
    
       @Override
       public void onPageStarted(WebView view, String url) {
            loadingFinished = false;
            //SHOW LOADING IF IT ISNT ALREADY VISIBLE  
        }
    
       @Override
       public void onPageFinished(WebView view, String url) {
           if(!redirect){
              loadingFinished = true;
           }
    
           if(loadingFinished && !redirect){
             //HIDE LOADING IT HAS FINISHED
           } else{
              redirect = false; 
           }
    
        }
    });
    

    【讨论】:

      【解决方案4】:

      您如何访问onPageFinshed() 中的pd? (你确定它实际上是在页面加载时调用的吗?)

      在您的onCreate() 中,尝试将pd 传递给您的homeClient,以便homeClient 可以处理关闭对话框。

      您的 homeClient 应如下所示:

      private class homeClient extends WebViewClient {
      
          private ProgressDialog pd;
      
          public homeClient(ProgressDialog pd) {
              this.pd = pd;
          }
      
          @Override 
          public boolean shouldOverrideUrlLoading(WebView view, String url) {           
              view.loadUrl(url); 
              return true; 
          } 
      
          @Override
          public void onPageFinished (WebView view, String url) {
              if (pd.isShowing()) {
                  pd.dismiss();
              }
          }
      }
      

      在你的onCreate():

      ProgressDialog pd = ProgressDialog.show(Fbook.this, "", 
                      "Loading. Please wait...", true);
      webview.setWebViewClient(new homeClient(pd));
      

      【讨论】:

      • 很好的例子,我喜欢!
      • 酷...我已经错过了几分钟的部分。
      【解决方案5】:

      如果您只是想在 WebView 中加载网页之前显示进度。您可以像

      一样简单地请求 Window Feature Progress
      getWindow().requestFeature(Window.FEATURE_PROGRESS); 
      

      setContentView(R.layout.blahblah);之前

      并在 onProgressChanged 中显示进度

       final Activity context= this;
       webview.setWebChromeClient(new WebChromeClient() 
       {
         public void onProgressChanged(WebView webView, int progress) 
         {
           activity.setProgress(progress * 1000);
         }
       });
      

      如果你想添加你自己的 ProgressDialog 然后使用 WebviewClient

      webView.setWebViewClient(new WebViewClient() {
          ProgressDialog rogressDialog ;
          @Override
          public void onPageStarted(WebView view, String url, Bitmap bitmap) {
              progressDialog = ProgressDialog.show(context, "Loading...", "Please wait...");//where context = YourActivity.this;
              super.onPageStarted(view, url, bitmap);
          }
      
          @Override
          public void onPageFinished(WebView view, String url) {
              progressDialog .dismiss();
              super.onPageFinished(view, url);
          }
      });
      
      webView.loadUrl(url);
      

      【讨论】:

        【解决方案6】:
        wv1.setWebViewClient(new WebViewClient() {
                    public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
                        Toast.makeText(Entertainment.this, description, Toast.LENGTH_SHORT).show();
                    }
        
                    @Override
                    public void onPageStarted(WebView view, String url, Bitmap favicon)
                    {
                        progressDialog.show();
                    }
        
        
                    @Override
                    public void onPageFinished(WebView view, String url) {
                        progressDialog.dismiss();
                        String webUrl = wv1.getUrl();
        
                    }
        
                });
        
            wv1.loadUrl(url);
        

        上面的代码将为您导航到 web 视图中的每个传入链接显示一个进度对话框。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多