Java 加载 webview 后如何让我的进度对话框关闭?

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/3283819/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-13 19:20:45  来源:igfitidea点击:

How do i make my progress dialog dismiss after webview is loaded?

javaandroidwebviewprogressdialogdismiss

提问by brybam

What do I need to my code to make the dialog dismiss()after the webview is loaded?

dismiss()加载 webview 后,我的代码需要什么才能创建对话框?

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

        }

I've tried

我试过了

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

Didn't work.

没用。

采纳答案by Jorgesys

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

:o webview.setWebViewClient(new homeClient()); 家庭客户端()????

try this

尝试这个

...
...
...

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

}

Update::this is a good example.

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

Android WebView and the Indeterminant Progress Solution

Android WebView 和不确定进度解决方案

回答by Andy Zhang

How are you accessing pdin onPageFinshed()? (And are you sure it's actually called when the page loads?)

你是如何访问pdonPageFinshed()?(你确定它在页面加载时被调用了吗?)

In your onCreate(), try passing pdto your homeClientso that homeClientcan take care of dismissing the dialog.

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

Your homeClient should look like this:

您的 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();
        }
    }
}

In your onCreate():

在您的onCreate()

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

回答by Samuel De Backer

This is OK.

还行吧。

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


}

回答by neteinstein

@Jorgesys this is not 100% accurate. If you have several iframes in a page you will have multiple onPageFinished (and onPageStarted). And if you have several redirects it may also fail. This approach i think solves all the problems:

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

    }
});

回答by Jawad Zeb

If you simply want to show Progress before webPage loading in WebView. You can simply request for Window Feature Progresslike

如果您只是想在 WebView 中加载网页之前显示进度。您可以简单地请求窗口功能进度,例如

getWindow().requestFeature(Window.FEATURE_PROGRESS); 

before setContentView(R.layout.blahblah);

setContentView(R.layout.blahblah);

and show it progress in onProgressChanged like

并在 onProgressChanged 中显示它的进度,例如

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

And if you want to add you own ProgressDialog then use WebviewClient

如果你想添加你自己的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);

回答by lancer025

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

The above code will show a progress dialogue for every incoming link you navigate to the in webview.

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