Android : 如何在WebView顯示的頁面中查找內容
Author : Aoyousatuo Zhao
http://blog.sina.com.cn/aoyousatuo
WebView是Android提供的常用組件之一。它主要被設計用來顯示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 view.setFindIsUp(true) to get the match to draw; This function is hidden and subject to change, so your app may break in a future release.
WebView對搜尋查找功能不能充分地支持。然而,我們可以嘗試着調用setFindIsUp方法來得到查詢的結果,並且把它顯示在當前屏幕(畫出來)。這個方法被隱藏並且容易發生變化,所以你的應用或許在未來的版本中不能正常地使用它。
由此可見,要想findAll 和 findNext起作用,必須調用setFindIsUp方法,但是此方法是內部函數,因此安全性不能保證,或許在未來某個版本就被和諧了。
盡管如此,這也是目前唯一較穩妥的一種解決方案。以后版本如果不能正常使用,說不定WebView會有更好的支持方法呢!
Example :
假設WebView已經裝載了html內容,下面是搜尋部分的程序:
WebView webView = (WebView)findViewById(R.id.webView) ;
webView.findAll(“a”) ;
try{
Method m = WebView.class.getMethod(“setFindIsUp”, Boolean.TYPE) ;
m.invoke(webView, true) ;
}catch(Throwable ignored)
{
}
findNext的使用同理,這里不再累述。
總結:
l WebView 的findAll & findNext方法必須配合類內部方法setFindIsUp使用.
l findAll效果是用空心框反白所有匹配的內容,用實心框反白第一個搜尋到的匹配內容,並且將其顯示到當前屏幕。
l 如果需要取消搜尋的狀態,可以調用clearMatches方法。
另外,如果從本文章中獲益,請支持一下寡人。
