❶ android中,如何屏蔽WebView里的超链接
mWebView.setWebViewClient(new MyWebviewClient());
class MyWebviewClient extends WebViewClient{
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
return true;
}
}
shouldOverrideUrlLoading 这个方法就是点击网页上的超链接的回调函数 按照我这样做就没问题了。
❷ Android activity中加载了webview,页面跳转后总是要点击两次手机的返回按钮才能回到上一页
WebViewClient中的shouldOverrideUrlLoading方法如下重写:
java">@Override
(WebViewview,Stringurl)
{
view.getSettings().setCacheMode(WebSettings.LOAD_DEFAULT);
view.loadUrl(url);
returnsuper.shouldOverrideUrlLoading(view,url);
}
onKeyDown如下重写:
@Override
publicbooleanonKeyDown(intkeyCode,KeyEventevent)
{
if(keyCode==KeyEvent.KEYCODE_BACK){
if(webView.canGoBack()){
webView.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
webView.goBack();
returntrue;
}else{
finish();
returntrue;
}
}
returnfalse;
}
❸ android webview这个坑货-之一
android上webivew是个坑货,无疑!以前就曾出现过好几次莫名其妙的发出signal退出进程的例子,你退就退对应的activity就行了,为啥要把整个进程干掉?这回遇到的是一个crash,基本都在8.x机器上,而且绝大部分都是华为和荣耀机器,比如DUB-AL00占比三分之一。堆栈如下:
另外还有一个信息,crash的线程是在一个我用HandlerThread写的后台处理线程类A,这个类调用的地方不多,大概七八处。
解决思路:
一、先复现
根据上报的机型model和日志里的信息,发现是搜索某个特定的剧后crash的,找到相应的机器后,确实能复现,是个第三方的剧的网页,进去后播放没问题,但是如果做些点击的操作就90%以上概率会crash,而且,同样的8.x机器,非上报机型的华为或荣耀不能复现。
但是,同样的机型,使用同样sdk的公司内另一个app却没事。
二、可能性
对于1,尝试各方面对齐另一个app后,未果,一样crash。
对于2,找遍了各种调用方式上异同,比如传参等,未果,一样crash
那看起来是3了,但是不敢面对这个现实哈哈。
尝试通过breadpad来恢复堆栈,不可行,没有chrome的带symbol的so库。
想来想去,还是回到crash本身,为啥每次都在那个线程类A里,是上报系统不准还是确实和线程A有关,反正调用A的地方也不多,那索性都给注释了,再试,果然没问题,那接下来就简单了挨个排除就行了,最后发现是在那个线程里会读取剪贴板的地方有问题,不读剪贴板就行了。回过头看堆栈:
刚好可以对上,所以猜测,是非主线程里读取了剪贴板了,导致webview在主线程里对剪贴板相关操作时崩溃,具体源码没去看了,有兴趣的可以研究下。
嗯,其实一开始就应该把线程A和堆栈里的Clipboard联想起来的。
解决方案:
线程A里调用剪贴板的地方,换成在主线程里调。
❹ android webview中的按钮弹框无法点击
webview 设置WebChromeClient
❺ Android webview 加载网页,网页中的双击事件失效,如何解决
webview 有没有设置允许javascript脚本
加个属性rel="external"试试
❻ android开发WebView怎么禁用鼠标滚轮事件
因为你禁掉了webview的滚轮事件,而在webview中你鼠标滚轮事件是去调webview自己的,所以才没有作用。
❼ 关于Android WebView的那些事
[TOC]
Webkit是一个开源浏览器项目,其中,对Android开发者来说,或多或少的都有些接触。 在应用层来看,最经常使用无非这么几个类:WebView(Android中最为复杂,也是最为简单的一个View,继承自AbsoluteLayout),WebViewClient、WebChromeClient(作为回调控制类)、WebSettings(进行设置项的配置)等;Webkit内部包含了网络请求、页面渲染、Js引擎等等。在Android4.4之前的版本中,系统使用的是Webkit内核,其后,切换到Google的Chromium内核。本文主要介绍的是在Android中,如何使用Webkit进行H5页面的展现,以及常见问题的分析手段。
下面的内容抄自网络 & 乱七八糟的地方,简单了解一下。
<b><i>前面都是吹牛逼的信息,如何使用Webkit来更好的搬砖? 且听如下分解</i></b>
XML布局中丢一个 <WebView> 标签,然后再 Activity 或者 Fragment 中 findViewById ,进而 loadUrl ,一般也没人这么简单的用,除非写Demo。很简单,它就是一个Layout,提供了一个调用加载页面的接口,不写范例了,能看到这篇文章的都看过Google的API说明。
主要涉及到WebView和WebSettings两个类。
例如:
其实就是WebView的父类ViewGroup和View的方法,不多说了。不过需要注意的是,不是所有的View或ViewGroup的方法对WebView都生效。
列举几类常用的,几乎所有App的 WebView 都会设置的属性:
</br>
如何处理页面跳转以及特殊 Scheme
这个回调可以说是最容易出问题的一个回调,表示什么? 字面意思,让你重写这个URL 的loading,比如点击html打电话的一个 <a href=“tel:110”> 标签,作为一个有节操、有责任心的浏览器,你需要处理 H5常用的几个Scheme :
除此之外,还有各个应用自定义的scheme ,举个例子,支付宝的支付Scheme : alipay: 。 这里的返回值,就代表你有没有能力处理这个url,没有的话Webkit就默认处理了。
需要注意的是,这个回调的触发的绝大多数情况是点击页面的 <a href="xxxx"> a标签,在Android中 loadUrl("http://www..com") ,是不会回调的,为什么不会回调,各位自行理解吧。
超链接 <a> 标签怎么写: 点我
特别说下窗口常见的两种打开方式:
针对单页模式的WebView框架(所有的html窗口均使用同一个WebView实例),不需要关注target的。
如果作为一个成熟的浏览器框架的话,是需要支持Html、JavaScript使用新窗口打开页面,需要实现如下回调:
还有一个相关设置项: WebSettings.
此时,系统将不会再回调 shouldOverrideUrlLoading 。新窗口逻辑的具体实现机制,可以参考系统browser实现逻辑。
<b> 这里有个坑 </b>
Android 4.4版本 ,如果实现了onCreateWindow,也就是说页面 <a> 标签是这么写的: <a href="http://www..com" target="_blank"> ,点击此链接打开的新WebView窗口,此窗口中的url点击,是不会触发 shouldOverrideUrlLoading 。 这是刚替换成Chrominum内核出的一个bug。本人并没在新版本上验证是否已经修复。
另外,根据不同的Rom,底层实现是不一样的,有的ROM会帮你处理各种调起scheme,也就是startActivity,有的ROM点一个url,就会抛一个intent出来,让用户选择系统浏览器进行加载。
系统默认,提供了一个接口:
有什么安全隐患呢?
戳这里
如果不知道Js怎么写, 请戳我
用PC的截图意思一下,看出区别了吧。 这里确定、取消点击以后就得调用 JsResult、JsPromptResult 的 confirm或者cancel。
因为安全问题,大一些的App Native与Js通信都不再用 WebView.addJavascriptInterface(Object) 了,都改用JsPrompt,因为JsPrompt中有message、有JsPromptResult可以返回给Js一些信息,所以桥选中了JsPrompt,另一个备选方案是JsConsole。
大体有这么几种方式进行传递
具体方案实现时,多方面考虑使用何种方式。
还有一个比较牛逼的
系统源码中均有方法注释,怎么用自己看吧。
那么问题来了
查了下,只有这两个相关的:
WebBackForwardList BackForwardList()
void clearHistory()
系统提供的关于历史记录的操作并不多,因为,不支持单条删除啊,啊啊啊!
WebViewClient中,还有一个相关callback,当系统更新历史记录时回调:
void doUpdateVisitedHistory(WebView view, String url, boolean isReload)
<b>相关问题分析法:历史栈回退错误的定位</b>
绝大多数回退错误是由于接口调用、回调中逻辑执行时序错误。
定位方法:利用 BackForwardList , doUpdateVisitedHistory 两个接口在 loadUrl、onPageStart、onPageFinish 以及逻辑相关的地方调用,打log,查看历史栈,这里注意下由于loarl是异步的,需要考虑是否加延迟等等保证调用时机的准确。
本人曾经遇到一个问题:在WebChromeClient中的 JsPrompt回调中,直接进行WebView.goBack操作,结果发现WebView确实回退到上一个页面,但是BackFowardList当前页面的index未更新的问题,具体见另一个篇blog。
网上有很多关于WebView内存泄露的讨论,据传,老版本的WebView在展示大量图片的时候,即使 WebView.destory() WebView=null ,也不会销毁。
在新版本上,实际测试结果:compileSDKVersion 23 不会泄露。
一般,我们如何销毁WebView比较保险?
这个问题好大。。。
暂时不介绍,另起blog进行说明。
解决方案:
实现回调 void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error)
首先,提几个需要注意的点:
个人归纳总结几点:
step1 进入开发者模式,勾选“显示布局边界”;
step 2,回到你想查看的界面; step 3 假如内容区只有一层基本就是H5 WebView的,多个层级,就是Native。
看到左右图的差异了吧。
还有另一种方法,RD屌丝们看这里,特别说明,这种方法不太适合浏览器。 (自有内核,可能会不准确)
好了,就介绍到这里,零零散散的几年前写的文章,第一篇blog,如有不对的地方,还恳请大家指正。
❽ android的webview的怎么可以禁止跳转
新建一个工程A,并实现一个Activity,用来接收外部的跳转。代码如下:
public class JumpActivity extends Activity{
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
Intent intent = getIntent();
String data = intent.getDataString();
System.out.println(data);
}
}
在这个Activity里,我们可以通过getIntent(),来获取外部跳转传过来的信息。
修改ManiFest文件,设置Activity的接收Action的属性,代码如下:
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data
android:host="data"
android:scheme="sharetest" />
</intent-filter>
如上所示,在data里设置了 scheme和host,则该Activity可以接收和处理类似于 "sharetest://data/XXX"的链接。
接下来我们可以写一个测试工程B,看看工程A中的JumpActivity是否可以接收和处理类似于 "sharetest://data/XXX"的链接。因此,新建一个工程B,工程里只有一个WebView,用来打开一个本地的网页。由于WebView在接收到自己不能处理的Uri时,会自动的调用发送Intent来调用能够处理该Uri的应用。
以下是网页的代码:
<!DOCTYPE html>
<html>
<body>
<iframe src="sharetest://data/123" style="display:none"></iframe>
</body>
</html>
❾ webview怎样禁止双击缩放
// 关闭缩放
webSettings.setBuiltInZoomControls(false);
webSettings.setSupportZoom(false);
webSettings.setDisplayZoomControls(false);
❿ android webview怎么禁止缩放
要支持缩放,肯定要先支持JavaScript,加如下代码:
//支持JS
WebSettings settings = mWebView.getSettings();
settings.setJavaScriptEnabled(true);123123
重点来了,要想支持缩放,要加如下代码支持
//支持屏幕缩放
settings.setSupportZoom(true);
settings.setBuiltInZoomControls(true);
我们怎样去掉它呢,在Android3.0之后实现非常简单,加一句代码就可以了,如下代码:
//不显示webview缩放按钮
settings.setDisplayZoomControls(false);
所以说,我们没有必要兼容2.x了,就像iOS开发只兼容到IOS7版本就OK了,但是有的同学又说,我有强迫症,我就想兼容到2.x版本,其实解决方案网上都有了,这里用到了Java反射的知识,通过反射来获取私有的属性控件mZoomButtonsController,然后就其setVisibility(View.GONE)隐藏就可以了,下面贴出代码实现:
public void setZoomControlGone(View view){
Class classType;
Field field;
try {
classType = WebView.class;
field = classType.getDeclaredField("mZoomButtonsController");
field.setAccessible(true);
ZoomButtonsController mZoomButtonsController = new ZoomButtonsController(view);
mZoomButtonsController.getZoomControls().setVisibility(View.GONE);
try {
field.set(view, mZoomButtonsController);
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
} catch (SecurityException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
}