【问题标题】:Show ProgressBar while loading a url to a WebView将 URL 加载到 WebView 时显示 ProgressBar
【发布时间】:2014-12-05 14:16:34
【问题描述】:

是否可以在加载 url 时显示进度条?我需要在进度条中显示进度级别,我可以使用自定义进度条。但是我无法找到代码来获取他加载多少网址的确切进度。这是我当前的代码:

  public class MainActivity extends ActionBarActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    browser = (WebView)findViewById(R.id.webView1);
    progressBar = (ProgressBar)findViewById(R.id.progressBar);
    browser.setWebViewClient(new MyBrowser());
    browser.setWebChromeClient(new MyCustomChromeClient());
    mContext=this.getApplicationContext();
    browser.loadUrl(target_url);
    MainActivity.this.progressBar.setProgress(0);
}

private class MyBrowser extends WebViewClient {

    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        String host = Uri.parse(url).getHost();
        if (host.equals(target_url_prefix))
        {
            if(mWebviewPop!=null)
            {
                mWebviewPop.setVisibility(View.GONE);
                baseLayout.removeView(mWebviewPop);
                mWebviewPop=null;
            }
            return false;
        }

        if(host.equals("m.facebook.com"))
        {
            return false;
        }
        view.loadUrl(url);
        return true;
    }

    @Override
    public void onReceivedError(WebView view, int errorCode,
                                String description, String failingUrl) {
        noInternet();
    }

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

    @Override
    public void onPageFinished(WebView view, String url) {
        unvisible();
        System.out.println("\n" +view.getUrl());
        if(url.startsWith("https://m.facebook.com/v2.1/dialog/oauth")){
            if(mWebviewPop!=null)
            {
                mWebviewPop.setVisibility(View.GONE);
                baseLayout.removeView(mWebviewPop);
                mWebviewPop=null;
            }
            view.loadUrl(redirectUrl);
            return;
        }
        super.onPageFinished(view, url);
    }
}

private class MyCustomChromeClient extends WebChromeClient
{

    @Override
    public boolean onCreateWindow(WebView view, boolean isDialog,
                                  boolean isUserGesture, Message resultMsg) {
        mWebviewPop = new WebView(mContext);
        mWebviewPop.setVerticalScrollBarEnabled(false);
        mWebviewPop.setHorizontalScrollBarEnabled(false);
        mWebviewPop.setWebViewClient(new MyBrowser());
        mWebviewPop.getSettings().setJavaScriptEnabled(true);
        mWebviewPop.getSettings().setSavePassword(false);
        mWebviewPop.setLayoutParams(new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
                ViewGroup.LayoutParams.MATCH_PARENT));
        baseLayout.addView(mWebviewPop);
        WebView.WebViewTransport transport = (WebView.WebViewTransport) resultMsg.obj;
        transport.setWebView(mWebviewPop);
        resultMsg.sendToTarget();

        return true;
    }

    @Override
    public void onCloseWindow(WebView window) {
    }

    @Override
    public void onProgressChanged(WebView view, int newProgress) {
        MainActivity.this.setValue(newProgress);
        super.onProgressChanged(view, newProgress);
    }
}
public void setValue(int progress) {
    this.progressBar.setProgress(progress);
}
}

如何获取加载 url 的确切进度。使用此代码,我可以加载进度条,但它显示为不确定的进度条。我想显示一个自定义视图的进度条。它应该显示成功加载 url 的百分比。所以也许我可以夸大自定义视图,但我不知道如何获得确切的百分比。有人可以帮我处理这段代码吗?

【问题讨论】:

    标签: android url android-asynctask handler android-progressbar


    【解决方案1】:

    WebChromeClient 的 onProgressChanged() 为您提供有关页面加载状态的进度。请参阅 android api 文档中有关该功能的以下信息。

    public void onProgressChanged (WebView view, int newProgress)
    
    Added in API level 1
    Tell the host application the current progress of loading a page.
    
    Parameters
    view    The WebView that initiated the callback.
    newProgress Current page loading progress, represented by an integer between 0 and 100.
    

    【讨论】:

    • 谢谢 :) 正是我需要的答案 :)
    【解决方案2】:

    我不熟悉您的 Webview。但是我通常在 doInBackground AsyncTask 中打开 URL。所以我找不到直接用百分比表示的方法。但是您可以做的可能是欺骗,例如:

    Set 20% when your app has confirmed that there is a INTERNET connection enables on the Device.
    Set 50% when it reaches the AsyncTask to open URL (or however you initialize .connect())
    And finally set 100% when URL is opened.
    

    这是一个伪方法。但否则你应该以某种方式使用时间(秒)。但是一个应用程序无法预见打开 URL 需要多长时间。 100% 表示打开 URL 所需的秒数,但在加载 URL 期间无法访问,因为当时 App 不知道它需要打开多少秒。

    您可以进行测试运行并计时秒数。当您开始打开 ​​URL 时设置一个计时器,并在打开它时停止计时器。但那个时间只是在那种特殊情况下..如果有人使用速度慢的 Android 设备,或者互联网连接不好,可能需要更长的时间。

    希望我的回答对您有所帮助。如果有一种方法可以更精确地做某事,我相信这里的人会写出来。

    【讨论】:

    • 谢谢 :) 我也想到了计时器。但这在不同的设备中可能会有所不同。感谢您的想法。
    猜你喜欢
    • 1970-01-01
    • 2012-07-02
    • 2011-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多