【问题标题】:Android webview setWebViewClient() show nothingAndroid webview setWebViewClient() 什么都不显示
【发布时间】:2016-04-08 08:11:50
【问题描述】:

伙计们!我无法使用 android-webview 加载 html 页面。我需要使用我的 webview 加载 url,而不是使用移动系统浏览器或其他浏览器,所以我必须将方法 setWebViewClient() 应用于我的 webview 但不是 WebChromeClient()。但是,当应用 setWebViewClient() 时,除了空白页面什么都没有加载,并且与后面的方法一起工作正常。不知道哪里出了问题,代码如下:

.xml

<WebView android:id="@+id/webview"
         android:layout_marginTop="50dp"
         android:layout_width="fill_parent"
         android:layout_height="fill_parent"/>

.java

WebView webView = (WebView)findViewById(R.id.webView);
WebSettings webSettings = webView.getSettings();
webSettings.setJavaScriptEnabled(true);

if (Build.VERSION.SDK_INT >= 19) {
    webSettings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
}

private String loadUrl = "http://www.baidu.com";
webView.loadUrl(loadUrl);

webView.setWebViewClient(new WebViewClient() {
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        view.loadUrl(url);
        return true;
    }
    @Override
    public void onLoadResource(WebView view, String url) {
        view.loadUrl(url);
        super.onLoadResource(view, url);
    }
    @Override
    public void onPageStarted(WebView view, String url, Bitmap favicon) {
        view.loadUrl(url);
        super.onPageStarted(view, url, favicon);
    }
});

/*
webView.setWebChromeClient(new WebChromeClient() {
    @Override
    public void onProgressChanged(WebView view, int newProgress) {
        Log.v(Log_Tag, String.valueOf(newProgress));
    }
});
*/

【问题讨论】:

  • 不应该 webView.loadUrl(loadUrl);在你设置 webviewclient 之后?
  • 另外,如果你想让你的WebView加载页面,你应该从shouldOverrideUrlLoading()中删除return false;,并删除view.loadUrl(url);
  • 好吧,@Mike M.!没错,它应该 return false 到方法 shouldOverrideUrlLoading()。非常感谢,也感谢 SmashingIntelliJ Amiya。而且,我想知道如何在加载页面时定义一个方法来显示进度更改,例如 setWebChromeClient() 中的方法 onProgressChanged i> ?
  • 好吧,伙计们!我对这两个 client-method 有误解,我想知道 webView 只能应用一个他们,但我错了! setWebChromClient 方法是使 webView 可用于某些 javascript 交互的支持方法!再次感谢@Mike M.!谢谢!

标签: android webview


【解决方案1】:

只需将此代码放入您的活动中

private String loadUrl = "https://www.google.com";

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    WebView mWebView = (WebView) findViewById(R.id.webView);
    WebSettings mWebSettings = mWebView.getSettings();
    mWebSettings.setJavaScriptEnabled(true);
    WebViewClient mWebViewClient = new WebViewClient();
    mWebView.setWebViewClient(mWebViewClient);
    mWebView.loadUrl(loadUrl);
}

如果您不想更改 WebViewClient 类中的方法或添加某些功能,则不应覆盖它们。并且不要忘记将权限 Internet 添加到您的清单文件。没有它,WebView 将无法工作。

【讨论】:

  • 嗨,@HooliGun!我真的需要重写 WebViewClient 中的一些方法来处理加载状态和其他操作。在 Mike M. 的帮助下,问题已经解决了,我稍后会详细发布答案,谢谢。
【解决方案2】:

再次感谢@Mike M.。如果你想用你的 webView 而不是用移动系统默认浏览器或其他第三方浏览器。而且,如果您想用您的 webView 处理网页的一些 javascript 操作,建议您将 WebChromClient 应用到您的 webView。

这是一个很好的例子:

WebView webView = (WebView)findViewById(R.id.webView);
WebSettings webSettings = webView.getSettings();
webSettings.setJavaScriptEnabled(true);

//load the page with cache
if (Build.VERSION.SDK_INT >= 19) {
    webSettings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
}


webView.setWebViewClient(new WebViewClient() {
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        //return true load with system-default-browser or other browsers, false with your webView
        return false;
    }

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

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

webView.setWebChromeClient(new WebChromeClient() {
    @Override
    public void onProgressChanged(WebView view, int newProgress) {
        Log.v(Log_Tag, String.valueOf(newProgress));
        //put your code here if your want to show the progress with progressbar
    }
});

private String loadUrl = "http://www.baidu.com";
webView.loadUrl(loadUrl);

【讨论】:

  • 我会提到WebViewClient 类中shouldOverrideUrlLoading() 方法的默认行为只是return false;,所以如果您实际上不需要覆盖任何其他方法,你可以在WebView 上设置一个WebViewClient 而无需匿名子类化它。即webView.setWebViewClient(new WebViewClient());
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-31
  • 1970-01-01
  • 2021-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多