如何在WebView显示的页面中查找内容

如何在WebView显示的页面中查找内容,第1张

它主要被设计用来显示html文件。正因为如此,所以在应用的开发过程中我们可以通过将需要显示的内容整理成html格式的String从而轻松实现各种排版的效果。

虽然WebView组件封装了许多功能为应用的开发提供了便利,但是由于其开放的方法有限,有时候这种便利往往会给开发者造成很大的约束,例如开发者不能方便的控制WebView的显示起始行,不能得到相关的行信息等。所以说WebView方便大众的时候也难免会存在许多不足之处。

寡人在开发应用的过程中就遇到了一个难题:将html中指定的内容显示到当前屏幕中。怎么解决这个问题呢?寡人一遍遍地研究WebView开放的方法,始终没有得到很好的方案。白道不行,咱就来黑道,正史不行,咱就搜集野史,所谓条条大路通罗马嘛!于是寡人就到处搜寻WebView的源代码,希望通过非常规的办法(调用WebView类库中未开放的方法)有所起色。但是非常困难。并且显而易见,即使找到了,也是不安全的调用。这就像上海的楼倒倒,说不定什么时候就坍为平地。此路不但坎坷,前途未卜,而且有可能是断头路。

苍天啊!寡人虽然贵为天子但是有时候也很无奈,怎么办?寡人再次无奈地又审视了一下WebView开放的那几个可怜的方法。最后想了想,它们中最有希望救驾的只有findAll和findNext了。于是寡人想,如果能保证需要定位的内容的唯一性,通过搜寻需要定位的内容,不就把该内容显示到当前屏幕了吗?于是寡人大喜,打算着手一试,成功后举国欢庆。

但是,寡人一看帮助文档,这两个方法的说明为空,于是心中隐隐约约有一丝不安。果不其然,程序中一试,没有任何效果。寡人只好去咨询中西两位辅政大臣百度和谷歌了。终于有了答案。下面就下诏天下,各位爱卿听仔细了:

先看辅政大臣给朕的说法:

Find is not a fully supported feature in webview

However, try calling viewsetFindIsUp(true) to get the match to draw; This function is hidden and subject to change, so your app may break in a future releaseWebView对搜寻查找功能不能充分地支持。然而,我们可以尝试着调用

setFindIsUp

方法来得到查询的结果,并且把它显示在当前屏幕(画出来)。这个方法被隐藏并且容易发生变化,所以你的应用或许在未来的版本中不能正常地使用它。

由此可见,要想findAll和findNext起作用,必须调用

setFindIsUp

方法,但是此方法是内部函数,因此安全性不能保证,或许在未来某个版本就被和谐了。

尽管如此,这也是目前唯一较稳妥的一种解决方案。以后版本如果不能正常使用,说不定WebView会有更好的支持方法呢!Example :假设WebView已经装载了html内容,下面是搜寻部分的程序:

WebView webView = (WebView)findViewById(RidwebView) ;

webViewfindAll(a) ;try{Method m = WebViewclassgetMethod(setFindIsUp, BooleanTYPE) ;

minvoke(webView, true) ;

}catch(Throwable ignored){}findNext的使用同理,这里不再累述。总结:lWebView的findAll & findNext

方法必须配合类内部方法

setFindIsUp使用lfindAll效果是用空心框反白所有匹配的内容,用实心框反白第一个搜寻到的匹配内容,并且将其显示到当前屏幕。l

如果需要取消搜寻的状态,可以调用

可以用js加载css。

webviewsetWebViewClient(new WebViewClient() {

public void onPageFinished(WebView view, String url) {

src="file:///android_asset/xxxjs"

String baseUrl = "file:///android_asset";

viewloadDataWithBaseURL(baseUrl, strHtml, "text/html", "utf-8", null);

}

}

js文件如下:

function loadjscssfile(filename,filetype){

if(filetype == "js"){

var fileref = documentcreateElement('script');

filerefsetAttribute("type","text/javascript");

filerefsetAttribute("src",filename);

}else if(filetype == "css"){

var fileref = documentcreateElement('link');

filerefsetAttribute("rel","stylesheet");

filerefsetAttribute("type","text/css");

filerefsetAttribute("href",filename);

}

if(typeof fileref != "undefined"){

documentgetElementsByTagName("head")[0]appendChild(fileref);

}

}

调用方式:

loadjscssfile("testcss","css");

问题

由于android的WebView等相关类没有提供解析html网页内容的接口,想要获取网页的内容并解析出想要的元素内容,用android的固有API是没办法了。

解决思路

第一种,使用第三方解析html库,和android提供的库有冲突的。

第二种,使用JAVA与JS回调,通过JS解析html;

开源工具

适合android的HTML解析库的jsoup。

jsoup作用

可直接解析某个URL地址、HTML文本内容。

提供了一套非常省力的API,可通过DOM,CSS以及类似于JQuery的 *** 作方法来取出和 *** 作数据。

支持 HTML5 的解析器分支,可确保跟现在的浏览器一样解析 HTML 的方法,同时降低了解析的时间和内存的占用。

获取指定网页中的title的代码例子演示

效果图:

1)修改新建项目的res\Iayout目录下的布局文件mainxml,将默认添加的TextView组件删除,然后添加一个WebView组件

2)在MainActivity的onCreate()方法中,首先获取布局管理器中添加的Web View组件,然后创建一个字符串构建器,将要显示的HTML代码放置在该构建器中,最后应用IoadDataWithBaseURLO方法加载构建器中的HTML代码

android客户端常会调用到html页面,给webview页面适配android凌乱的设备带来很大的困难。

可以找到的方法是通过ZoomDensitysetDefaultZoom根据分辨率480宽度为基准缩放。

不过ZoomDensitysetDefaultZoom在20以下的平台是无法调用的,需要自己反射调用。

即使是ZoomDensitysetDefaultZoom设置了缩放,但还是会在很多设备无效。经过摸索还需做一些修改:

1,页面head添加

<meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />

2,设置字体也按480基准缩放。

下面是代码:

Java代码 

private void setZoom(WebSettings webSettings) {  int screenDensity = getResources()getDisplayMetrics()densityDpi;  String zd = "FAR";  switch (screenDensity) {  case DisplayMetricsDENSITY_LOW:      zd = "CLOSE";      break;   case DisplayMetricsDENSITY_MEDIUM:      zd = "MEDIUM";      break;  }  Class<> zoomDensityClass = null;  Enum<> zoomDensity = null;   try {      if (zoomDensityClass == null) {      zoomDensityClass = ClassforName("androidwebkitWebSettings$ZoomDensity");      }      if (zoomDensity == null) {      zoomDensity = (Enum<>) EnumvalueOf((Class) zoomDensityClass,zd);      }       Method method = WebSettingsclassgetDeclaredMethod( "setDefaultZoom", new Class<>[] { zoomDensityClass });      if(method!=null){      methodinvoke(webSettings, zoomDensity);      }            method = WebSettingsclassgetDeclaredMethod( "setTextZoom", new Class<>[] { intclass });      if(method!=null){      methodinvoke(webSettings, 100  getWindowManager()getDefaultDisplay()getWidth() / 480);      }  } catch (Exception e) {      Loge(TAG, egetMessage());      return;  }     }

Android的webview加载本地html、本apk内html和远程URL

Android的webview加载本地html、本apk内html和远程URL

android客户端常会调用到html页面,给webview页面适配android凌乱的设备带来很大的困难。

可以找到的方法是通过ZoomDensitysetDefaultZoom根据分辨率480宽度为基准缩放。

不过ZoomDensitysetDefaultZoom在20以下的平台是无法调用的,需要自己反射调用。

即使是ZoomDensitysetDefaultZoom设置了缩放,但还是会在很多设备无效。经过摸索还需做一些修改:

1,页面head添加

<meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />

2,设置字体也按480基准缩放。

下面是代码:

Java代码 

private void setZoom(WebSettings webSettings) {  int screenDensity = getResources()getDisplayMetrics()densityDpi;  String zd = "FAR";  switch (screenDensity) {  case DisplayMetricsDENSITY_LOW:      zd = "CLOSE";      break;   case DisplayMetricsDENSITY_MEDIUM:      zd = "MEDIUM";      break;  }  Class<> zoomDensityClass = null;  Enum<> zoomDensity = null;   try {      if (zoomDensityClass == null) {      zoomDensityClass = ClassforName("androidwebkitWebSettings$ZoomDensity");      }      if (zoomDensity == null) {      zoomDensity = (Enum<>) EnumvalueOf((Class) zoomDensityClass,zd);      }       Method method = WebSettingsclassgetDeclaredMethod( "setDefaultZoom", new Class<>[] { zoomDensityClass });      if(method!=null){      methodinvoke(webSettings, zoomDensity);      }            method = WebSettingsclassgetDeclaredMethod( "setTextZoom", new Class<>[] { intclass });      if(method!=null){      methodinvoke(webSettings, 100  getWindowManager()getDefaultDisplay()getWidth() / 480);      }  } catch (Exception e) {      Loge(TAG, egetMessage());      return;  }     }

LZ你好

之所以不能返回是因为返回键的时候系统当做整个activity,而不是webview的历史页面

也就是说你必须消费掉back事件。

你可以覆盖activity中的方法

public

boolean

onKeyDown(int

keyCode,

KeyEvent

event)

{

if

((keyCode

==

KeyEventKEYCODE_BACK)

&&

mWebViewcanGoBack())

{

mWebViewgoBack();

return

true;

}

return

superonKeyDown(keyCode,

event);

}

这样就行,另外再提醒一点,如果在webview中点连接,默认的是会调用系统的浏览器

所以还需

mWebViewsetWebViewClient(new

WebViewClient(){

public

boolean

shouldOverrideUrlLoading(WebView

view,

String

url)

{

viewloadUrl(url);

return

true;

}

});

这样就能保证在webview中跳转

Webview是用来与前端交互的纽,可以加载本地Html文件,和网页并实现交互的功能。

WebView通过WebSetting可以使用Android原生的JavascriptInterface来进行js和java的通信。

加载本地文件:webViewloadUrl("file:///android_asset/xxxhtml");

加载网页:webViewloadUrl(">

以上就是关于如何在WebView显示的页面中查找内容全部的内容,包括:如何在WebView显示的页面中查找内容、webview获取服务器的HTML后怎样加上本地的CSS样式、Android中如何获取网页中的指定内容等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9724513.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-01
下一篇 2023-05-01

发表评论

登录后才能评论

评论列表(0条)

保存