Pau*_*Jan 43
从webview获取纯文本内容相当困难.基本上,Android类不提供它,但javascript确实如此,Android为javascript提供了一种将信息传递回代码的方法.
在进入细节之前,请注意,如果您的html结构很简单,那么手动解析数据可能会更好.
也就是说,这就是你做的:
为了澄清,我将在下面发布一个工作(但非常粗略)的代码示例.它在顶部显示webview,在底部显示带有基于文本的内容的textview.
package test.android.webview;
import android.app.Activity;
import android.os.Bundle;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.TextView;
public class WebviewTest2Activity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
WebView webView = (WebView) findViewById(R.id.webView);
TextView contentView = (TextView) findViewById(R.id.contentView);
/* An instance of this class will be registered as a JavaScript interface */
class MyJavaScriptInterface
{
private TextView contentView;
public MyJavaScriptInterface(TextView aContentView)
{
contentView = aContentView;
}
@SuppressWarnings("unused")
public void processContent(String aContent)
{
final String content = aContent;
contentView.post(new Runnable()
{
public void run()
{
contentView.setText(content);
}
});
}
}
webView.getSettings().setJavaScriptEnabled(true);
webView.addJavascriptInterface(new MyJavaScriptInterface(contentView), "INTERFACE");
webView.setWebViewClient(new WebViewClient() {
@Override
public void onPageFinished(WebView view, String url)
{
view.loadUrl("javascript:window.INTERFACE.processContent(document.getElementsByTagName('body')[0].innerText);");
}
});
webView.loadUrl("http://shinyhammer.blogspot.com");
}
}
Run Code Online (Sandbox Code Playgroud)
使用以下main.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<WebView
android:id="@+id/webView"
android:layout_width="match_parent"
android:layout_height="fill_parent"
android:layout_weight="0.5" />
<TextView
android:id="@+id/contentView"
android:layout_width="match_parent"
android:layout_height="fill_parent"
android:layout_weight="0.5" />
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)
wvbrowser.evaluateJavascript(
"(function() { return ('<html>'+document.getElementsByTagName('html')[0].innerHTML+'</html>'); })();",
new ValueCallback<String>() {
@Override
public void onReceiveValue(String html) {
Log.d("HTML", html);
// code here
}
});
Run Code Online (Sandbox Code Playgroud)
小智 5
上面提供的解决方案使用innerText 属性提供文本,该属性将返回webView 中的所有文本。我在下面提出的解决方案将帮助您从屏幕上 webView 的可见部分提取文本。
步骤1:需要javaScript的帮助,因此首先启用javascript。
webView.addJavascriptInterface(new IJavascriptHandler(getActivity().getApplicationContext()), "Android"); //if your class extends a Fragment class
Run Code Online (Sandbox Code Playgroud)
或者
view.addJavascriptInterface(new IJavascriptHandler(this), "Android"); //if your class extends Activity.
Run Code Online (Sandbox Code Playgroud)
第 2 步:创建一个 javaInterface 内部类。
final class IJavascriptHandler {
Context mContext;
IJavascriptHandler(Context c) {
mContext = c;
}
//API 17 and higher required you to add @JavascriptInterface as mandatory before your method.
@JavascriptInterface
public void processContent(String aContent)
{
//this method will be called from within the javascript method that you will write.
final String content = aContent;
Log.e("The content of the current page is ",content);
}
}
Run Code Online (Sandbox Code Playgroud)
第 3 步:现在您必须添加 javascript 方法。您将方法编写为字符串,然后加载它。该方法根据提供给它的参数返回文本。所以,你需要2个字符串。一个将加载 javascript 方法,另一个将调用它。
加载javascript方法的方法。
String javaScriptToExtractText = "function getAllTextInColumn(left,top,width,height){"
+ "if(document.caretRangeFromPoint){"
+ "var caretRangeStart = document.caretRangeFromPoint(left, top);"
+ "var caretRangeEnd = document.caretRangeFromPoint(left+width-1, top+height-1);"
+ "} else {"
+ "return null;"
+ "}"
+ "if(caretRangeStart == null || caretRangeEnd == null) return null;"
+ "var range = document.createRange();"
+ "range.setStart(caretRangeStart.startContainer, caretRangeStart.startOffset);"
+ "range.setEnd(caretRangeEnd.endContainer, caretRangeEnd.endOffset);"
+ "return range.toString();};";
Run Code Online (Sandbox Code Playgroud)
调用上述函数的方法。
String javaScriptFunctionCall = "getAllTextInColumn(0,0,100,100)";
//I've provided the parameter here as 0,0 i.e the left and top offset and then 100, 100 as width and height. So, it'll extract the text present in that area.
Run Code Online (Sandbox Code Playgroud)
第 4 步:现在,您需要加载上述 2 个 javascript。
webView.loadUrl("javascript:"+ javaScriptToExtractText);
//this will load the method.
view.loadUrl("javascript:window.Android.processContent("+javaScriptFunctionCall+");");
//this will call the loaded javascript method.
Run Code Online (Sandbox Code Playgroud)
享受。