我创建了Activity一个标题和Web视图LinearLayout.在onResume()它调用的方法中webView.loadUrl(url).问题是,活动首先显示标题,屏幕的其余部分为空白,然后启动设备浏览器以及URL的页面.我想看到的是页面显示在WebView标题下方.可能是什么问题呢?
编辑:好的,做了一些进一步的搜索,发现了这个:
它指向这里的WebView教程.
只需实现Web客户端并进行设置即可.
Android中的setWebViewClientvs. 之间的区别是什么setWebChromeClient?
从这个很好的解释有关之间的差异WebViewClient,并WebChromeClient似乎如果你使用一个,你不应该使用其他的(对于相同的WebView对象).
我的理解是否正确?
如果没有,何时会同时使用WebViewClient 和 WebChromeClient同一个WebView对象?
是否存在仅使用两者WebViewClient 和 WebChromeClient同一WebView对象才能实现某个目标的情况的示例?
在谷歌搜索答案时,似乎我不是唯一一个遇到似乎无法解决的问题的人.
我已经设法使用自定义WebViewClient创建WebView - 这使得我可以拥有processdialog并在无法加载URL时显示错误消息.
但这会产生JavaScript问题.我正在加载的URL有一些JavaScript,它改变了一些HTML元素的CSS样式(显示或隐藏元素)或重定向到另一个位置onclick - 或者甚至想要显示一个警告框.但是通过使用WebViewClient,这些都不起作用.
这是我加载页面的方式:
public void loadUrl(String url)
{
final ProgressDialog dialog = ProgressDialog.show(myActivity.this, "", getString(R.string.loading), true);
final WebView myWebView = (WebView) findViewById(R.id.webview);
myWebView.setVerticalScrollBarEnabled(false);
myWebView.setHorizontalScrollBarEnabled(false);
WebSettings webSettings = myWebView.getSettings();
webSettings.setJavaScriptEnabled(true);
myWebView.setWebViewClient(new WebViewClient()
{
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url)
{
Toast.makeText(myActivity.this, url, Toast.LENGTH_SHORT).show(); //Debugging purposes
if (url.endsWith(".mp4"))
{
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.parse(url), "video/mp4");
view.getContext().startActivity(intent);
}
else
{
view.loadUrl(url);
}
return true;
}
public void onPageFinished(WebView view, String url)
{
//Toast.makeText(myActivity.this, "Oh no!", Toast.LENGTH_SHORT).show(); …Run Code Online (Sandbox Code Playgroud) 我的应用程序中有一个WebView,其中一些站点被打开(总是相同的,它是我自己的页面).该站点有一些JS代码,可以从远程主机加载一些图像.
我想截取对这些图像的请求(通过URL模式)并返回我自己的内容(即另一个图像),或者根据内部应用程序逻辑保持请求不变.
有可能吗?
编辑:目前的问题状态......
WebView有能力设置WebViewClient(如Axarydax所述).WebViewClient有两个有用的方法
shouldOverrideUrlLoadingonLoadResourceshouldOverrideUrlLoading能够拦截任何URL加载,如果加载是由页面交互触发的(即单击页面上的链接,WebView.loadURL("")不会触发此方法).它还可以通过返回false来取消URL加载.这种方法不可用,导致'它无法拦截页面资源的加载(和图像,我需要拦截的是这样的页面资源).
onLoadResource每次加载页面资源(和图像!thx到jessyjones)时都会触发,但是没有办法取消它.这使得这种方法也不适合我的任务.
我的布局中有一个webview.默认情况下,会在其中打开搜索表单.在搜索时,搜索表单下方会显示一个列表部分.如果单击列表中的任何链接,则会打开详细信息页面.现在我想控制webview的后退导航.我将此代码放在Activity中.
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
Log.d("TYPE", TYPE);
WebView myWebView = null;
if (TYPE.equalsIgnoreCase("REPORT_ACTIVITY"))
myWebView = reportView;
if (TYPE.equalsIgnoreCase("FEEDBACK_ACTIVITY"))
myWebView = feedbackView;
if (myWebView != null)
// Check if the key event was the Back button and if there's history
if ((keyCode == KeyEvent.KEYCODE_BACK) && myWebView.canGoBack()) {
myWebView.goBack();
return true;
}
// If it wasn't the Back key or there's no web page history, bubble up
// to the default
// system behavior (probably exit the activity) …Run Code Online (Sandbox Code Playgroud) 我有这样的WebViewClient依恋WebView:
webView.setWebViewClient(new MyWebViewClient());
Run Code Online (Sandbox Code Playgroud)
这是我的实现MyWebViewClient:
private class MyWebViewClient extends WebViewClient {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
webView.loadUrl(url);
return true;
}
}
Run Code Online (Sandbox Code Playgroud)
我给了WebView一个URL来加载via loadUrl().如果我a href...在页面中有一个link(),我的shouldOverrideUrlLoading方法被调用,我可以拦截链接点击.
但是,如果我有一个方法的表单,则不调用POST该shouldOverrideUrlLoading方法.
我在这里注意到了一个类似的问题:http://code.google.com/p/android/issues/detail?id = 9122这似乎建议覆盖postUrl我的WebView.但是,此API仅从API级别5开始提供.
如果我在API级别4,我该怎么办?有没有其他方法来拦截表格帖子?
我的应用程序使用WebViewClient与服务器建立SSL连接.服务器配置为仅接受TLSv1.1及更高版本的协议.
1)如何检查哪些SSL协议是a)支持和b)在设备上使用Android WebViewClient时默认启用.
2)如何为我的应用程序中使用的Android WebViewClient实例启用特定的SSL协议.
在其中一个运行Android 4.3的测试设备上,WebViewClient抛出onReceivedError回调,其描述为"无法执行SSL握手"
Chrome日志如下:
01-29 15:58:00.073 5486 5525 W chromium_net:external/chromium/net/http/http_stream_factory_impl_job.cc:865:[0129/155800:警告:http_stream_factory_impl_job.cc(865)]回到SSLv3,因为主机是TLS不容忍的:10.209.126.125:443 01-29 15:58:00.083 5486 5525 E chromium_net:external/chromium/net/socket/ssl_client_socket_openssl.cc:792:[0129/155800:错误:ssl_client_socket_openssl.cc(792)]握手失败; 返回0,SSL错误代码5,net_error -107
我的应用程序还使用HttpClient和HttpsUrlConnection类来设置SSL连接.在使用这些类时,我能够使用SSLSocket API来启用特定协议. http://developer.android.com/reference/javax/net/ssl/SSLSocket.html#setEnabledProtocols(java.lang.String中[])
我需要对WebViewClient做同样的事情.
我建立一个WebView显示网站.该网站包含没有target="_blank"属性的链接和一些带有它的链接.
我需要打开target外部标准设备浏览器中定义的链接和WebView中没有它的链接.
我正在使用一个WebViewClient,我尝试了这个功能,但我的所有链接仍在以下内容中打开WebView:
备选方案1:
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
return super.shouldOverrideUrlLoading(view, url);
}
Run Code Online (Sandbox Code Playgroud)
备选方案2:
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}
Run Code Online (Sandbox Code Playgroud)
有人知道如何在外部打开空白链接吗?
谢谢!
PS:为了避免误解:我不能使用这种方法,因为我知道链接的唯一方法应该是外部打开target属性.
编辑:几年前我参与了这个项目,不幸的是我无法验证在给定的场景中是否有任何答案.
我很难用一个WebView来显示我们的博客.在启动时,它工作得很好.用户可以导航到WebView中的不同链接.要返回博客,WebView外部有一个按钮,可以再次加载主博客站点.
问题是,第二次调用loadUrl后没有加载任何内容.这是我的代码:
private WebView wv;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.setContentView(R.layout.blog);
wv = (WebView) findViewById(R.id.blog_webview);
wv.getSettings().setJavaScriptEnabled(true);
wv.setWebViewClient(new WebViewClient() {
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon {
MyLog.logDump("onPageStarted: " + url);
}
@Override
public void onPageFinished(WebView view, String url) {
MyLog.logDump("onPageFinished: " + url);
}
});
wv.loadUrl(Constants.BLOG_URL);
}
Run Code Online (Sandbox Code Playgroud)
我的OnClickListener调用的函数如下:
public void reLoadUrl() {
wv.loadUrl(Constants.BLOG_URL);
}
Run Code Online (Sandbox Code Playgroud)
但是,尽管onPageFinished和onPageStarted中的日志显示我的wv.loadUrl正在被调用并且它正在加载正确的url,但webview中的内容本身并没有改变.我已经尝试清除缓存,历史,视图,尝试过不同的WebSettings,试图使用webView.goBack() - 而不是结果.这些想法也不起作用:android中的奇怪的webview goBack问题
有时,reLoadUrl会显示所需的结果 - 但一旦失败,它就再也无法工作了.有什么想法会发生什么?我确实尝试过阅读WebView代码但我找不到任何可以帮助我的东西.
我唯一可以补充的是,我们正在使用一些严重依赖于webViews的广告网络 - 我试图将它们关闭,但我没有删除这些库,所以我不确定它们不是罪魁祸首.
有任何想法吗??